gpt4 book ai didi

python - 在python中制作查找表,写入可以在C程序中读取的二进制文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:49 26 4
gpt4 key购买 nike

我需要创建一个可用于速度和效率极其重要的应用程序的查找表。该表将存储时间值,这些时间值呈对数分布,因此每个数量级都具有相同数量的时间步长。每个时间值将指向一组波长值,这些波长值具有与之关联的强度值。所以像这样:

   t         lambda           I
0.0001 -> 0.01 -> 100
. 0.02 -> 300
. . .
. . .
. .
0.0002 -> 0.01 -> 200
. 0.02 -> 400
. . .
. . .
. .

等...

某些 C 代码中的函数将传递一个时间和波长,并从表中查找相应的强度。生成正确强度所需的函数非常费力,所以这就是我选择使用查找表的原因。我希望将查找表写入一个二进制文件,因为该文件将在计算集群的许多节点上加载到 RAM 中或从 RAM 中加载出来。由于我不熟悉查找表,所以我想知道什么是最好的(最快/最有效的)实现方式。

此外,是否可以从用 python 创建的数据结构写入二进制文件,然后用 C 读取?这在我的特定应用程序中非常有用,因为我已经与一些 python 代码交互以生成表的值。

最佳答案

您可以使用 struct module ,特别是 struct.pack 将 Python 数据转换为二进制数据字符串,然后您可以将其写入文件。

访问数据的最有效方式取决于具体情况。如果您对所有时间值使用相同范围的 lambda 值并且时间间隔始终相同,那么您知道每个 t 的强度数组的长度。在那种情况下,你可以说例如

offset = ((time - 0.001)/0.001 * amount_of_intensities + (lambda - 0.01)/0.01)

然后使用该偏移量创建一个指针。这假定您已将二进制文件读入内存并创建了指向它的正确类型的指针。

一个例子(在 IPython 中):

In [1]: import numpy as np

In [2]: data = np.random.random(20)

In [3]: data
Out[3]:
array([ 0.40184104, 0.60411243, 0.52083848, 0.50300288, 0.14613242,
0.39876911, 0.16157968, 0.70979254, 0.65662686, 0.14884378,
0.65650842, 0.40906677, 0.3027295 , 0.26070303, 0.82051509,
0.96337179, 0.34622595, 0.08532211, 0.65079174, 0.68009011])

In [4]: import struct

In [5]: struct.pack('{}d'.format(len(data)), *data)
Out[5]: 'f\xf9\x80y\xc3\xb7\xd9?\xe2x\x92\x99\xe3T\xe3?0vCt\xb5\xaa\xe0?7\xfcJ|\x99\x18\xe0?X\xf5l\x8ew\xb4\xc2?b\x9c\xd1\xden\x85\xd9?\xc4\x0c\xad\x9d\xa4\xae\xc4?\xae\xc3\xbe\xd7\x9e\xb6\xe6?\xd5\xf3\xebV\x16\x03\xe5?\x14J\x9a$P\r\xc3?p\xd4t\xf3\x1d\x02\xe5?\xfe\tUg&.\xda?\xf4hV\x91\xeb_\xd3?@FL\xc0[\xaf\xd0?$\xbe\x08\xda\xa8A\xea?\xf3\x93\xcb\x11\xf1\xd3\xee?\xce\x9e\xd9\xe7\x90(\xd6?\x10\xd2\x12c\xab\xd7\xb5?f\xac\x124I\xd3\xe4?}\x95\x1cSL\xc3\xe5?'

为了方便起见,我使用了 numpy 模块。它与 float 列表一样有效。

从里到外分析最后一行。格式表达式给出:

In [9]: '{}d'.format(len(data))
Out[9]: '20d'

这意味着我们要创建一个包含 20 个 d 值的字符串。 dformat character对于 IEEE 754 双宽度 float 。

所以我们真正拥有的是;

struct.pack('20d', *data)

data 之前的 * 运算符表示“解压此列表”。

请注意,二进制数通常不能在不同的硬件平台(例如 intel x86 和 ARM)之间移植。

一旦你有了这个大的二进制数数组,你就可以把它写入一个文件。

在 C 中,打开文件并将整个文件读入内存块。然后将正确类型的指针指向该内存块的开头,您就可以开始了。

关于python - 在python中制作查找表,写入可以在C程序中读取的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com