C / Python API:使用Py_BuildValue的效率

时间:2012-02-10 13:51:14

标签: python c

我目前正在使用C / Python API从大型二进制文件中读取数据。 Python中的这个结果不如纯C结果(时间x2)那么有效,因为我认为将时间包装到PyObject中所花费的时间。通常,我在PyArrayObject中存储42个元素的元组。为此,我使用:

PyObject *r = Py_BuildValue("(f, I, i, K, f, K, K, etc..)", a, b, c, etc...) ;

我的问题如下:是否有更有效的方法(更快的执行时间)?

例如:PyTuple_Pack(n,args)会更快地完成吗?

2 个答案:

答案 0 :(得分:0)

对于时间关键代码,我创建了一个所需长度的元组,然后单独创建组件并将它们填充到元组中。

答案 1 :(得分: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)第一个arg中带有parens的Py_BuildValue返回一个元组;你提到的这个“PyArrayObject”是什么?