Cython代码在针对python2和python3编译时运行速度慢了125倍

2024-04-27 03:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一大块Cython代码正在解析Touchstone files,我想使用python2和python3。我正在使用非常C风格的解析技术来实现我认为是最高效率的,包括手动malloc和释放char*,而不是使用bytes,这样我就可以避免GIL。使用编译时

python        3.5.2             0    anaconda
cython        0.24.1       py35_0    anaconda

我看到了我满意的速度,在小文件上有适度的提升(快20%),在大文件上有巨大的提升(快2.5x)。在编译时

^{pr2}$

它的运行速度大约慢了125倍(在python3中为17ms,而在python2中为~2.2s)。这是在不同环境中使用非常简单的setuputils脚本编译的完全相同的代码。我目前没有使用Cython的NumPy进行任何解析或数据存储。在

^{3}$

我排除了一些事情,比如类型转换。我还测试了代码在整个文件中循环而不做任何事情的地方。要么Cython优化了这一点,要么它非常快,因为它导致parse_touchstone甚至没有出现在cProfile/pstats报告中。当我在最后一个if row_idx == row_size块中放入print语句以打印一个状态后,我发现解析一个包含512个浮点数的行大约需要0.5-1秒(猜测时间),我确定这不仅仅是注释、空白和选项行解析(未显示明显更复杂的关键字值解析)在上面。这不需要太长时间,尤其是在使用strtod进行解析时。我还检查了只解析2行的值,然后跳出while循环,它告诉我解析注释、空白和选项行占用了大约800ms(总时间的1/3),而6行文本的总时间不到150字节。在

我是不是错过了什么?有没有一个小技巧可以让Cython代码在python2中比python3慢3个数量级?在

(注意:我没有在这里显示完整的代码,因为我不确定是否出于法律原因允许我这样做,而且总共大约有450行)


Tags: 文件代码风格选项时间anacondafiles事情
1条回答
网友
1楼 · 发布于 2024-04-27 03:40:39

问题出在strtod,而不是{a1}。显然,每次调用它时,它都会在内部计算输入字符串的长度,如果使用长字符串调用它,这将大大降低代码的速度。为了避免这种情况,您必须在strtod周围编写一个包装器,以便一次只使用较小的缓冲区(请参阅上面的链接以获取如何执行此操作的示例)或编写您自己的strtod函数。在

相关问题 更多 >