【发布时间】:2013-03-12 08:39:56
【问题描述】:
我想用 cython 编译一个 python 函数,用于读取跳过一些记录的二进制文件(不读取整个文件然后切片,因为我会用完内存)。我可以想出这样的东西:
def FromFileSkip(fid, count=1, skip=0):
if skip>=0:
data = numpy.zeros(count)
k = 0
while k<count:
try:
data[k] = numpy.fromfile(fid, count=1, dtype=dtype)
fid.seek(skip, 1)
k +=1
except ValueError:
data = data[:k]
break
return data
然后我可以像这样使用函数:
f = open(filename)
data = FromFileSkip(f,...
但是,为了使用 cython 编译函数“FromFileSkip”,我想定义函数中涉及的所有类型,所以“fid”以及文件处理程序。我如何在 cython 中定义它的类型,因为它不是“标准”类型,例如一个整数。 谢谢。
【问题讨论】:
-
为什么键入该变量很重要?因为它是一个 python 对象,所以你不会获得任何加速。
-
如果要将其分配给类变量,请使用
object类型。 -
所以键入文件句柄不会有太大变化?我认为与只输入其中一些变量相比,毫无例外地输入所有变量可以提高性能。
-
你应该避免在循环中调用 numpy.fromfile ,因为它是一个 python 函数,它很可能会成为你所有工作的瓶颈。考虑使用低级 C stdio 方法来提高速度。一些例子在这里:groups.google.com/forum/?fromgroups=#!topic/cython-users/…
-
文件句柄的类型为
file,它是一个内置的。我不知道这是否会对cython有所帮助。由于它是用 C 实现的类型,它可能能够避免通过解释器来调用它的方法。也就是说,文档似乎暗示 cython 并没有真正为任何非原始类型做任何特别的事情。
标签: python function cython filehandle