C/Python API:Py_BuildValue 使用效率
我现在正在使用C/Python的接口来从一个很大的二进制文件中读取数据。这样在Python中得到的结果效率没有纯C的结果高(时间慢了两倍),我觉得是因为把数据转换成PyObject的过程花了时间。通常,我会把42个元素的元组存储在一个PyArrayObject中。为此,我使用了:
PyObject *r = Py_BuildValue("(f, I, i, K, f, K, K, 等等..)", a, b, c, 等等...) ;
我想问的是:有没有更高效的方法来做到这一点(执行时间更快)?
比如说:使用PyTuple_Pack(n, args)会更快吗?
2 个回答
0
对于那些对时间要求很高的代码,我会先创建一个指定长度的元组,然后再一个个地创建里面的元素,把它们放进这个元组里。
0
看起来你在自己写一个定制版的 struct.unpack
... 你有没有试过用纯Python写一个二进制文件读取器呢?这其实是个很简单的工作,可以当作一个“样板”来用。
import struct
fmt = "f I i Q f Q Q etc.." # check endianness and alignment
structobj = struct.Struct(fmt)
recsz = structobj.size
assert recsz == EXPECTED_RECSZ
unpack = structobj.unpack
f = open('bigfile.bin', 'rb')
while True:
record = f.read(recsz)
if not record: break
a_tuple = unpack(record)
do_something(a_tuple)
f.close()
顺便问一下:(1)你的文件里有32位的浮点数和64位的整数吗?(2)用带括号的 Py_BuildValue
的第一个参数会返回一个元组;你提到的这个“PyArrayObject
”是什么东西?