使用%%timeit、循环速度或总运行时间测试性能更重要



我对10k-100k行的csv文件进行了数百万次迭代,因此性能至关重要。我一行一行地优化每一行,压缩每一秒的时间。这很简单,只需克隆一个数据帧系列。目前与这些初步结果混淆。

@numba.jit()
def test(x):
return x
#%%timeit
df['source'] = df['Close']
#79.5 µs ± 3.58 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
#%%timeit
df['source2'] = test(df['Close'].to_numpy())
#88.1 µs ± 683 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

第一个循环的总运行时间较快,但第二个循环的每个循环的运行时间较快。如果每个循环更快,我希望它总体上更快。

这是否意味着有更多的时间被用于后端?有人能向我解释一下吗?

我应该更重视总运行时间还是每个循环的时间?

注意,我在Anaconda上使用Jupyter笔记本。

对于总时间和迭代时间,我只能想到一件不同的事情。这是一个垃圾收集。Python的垃圾收集器不时检查哪些变量不再使用,并为它们释放内存。如果你运行一个循环,你可能永远不会看到它工作。但如果它运行的时间比大多数情况下长,它就会被触发并开始释放内存,这需要时间。因此,如果在循环期间分配了更多的内存,则垃圾收集器需要更多的时间来释放内存。

这种想法可能会给你的代码带来一个改进:
注意你分配了多少内存。

df['source'] = df['Close']可能意味着您将数据从一列复制到另一列。尽量重复使用数据。例如,执行col1 = df['Close'],然后使用col1进行进一步操作。这样数据就不会被复制,而且速度更快(以防您不需要列source并且它是临时使用的(。

还有另一种可能是通过不分配和释放内存来加快速度。当使用Numba时,在所有行上迭代并一次性进行计算会更快,而不是在使用Numpy/Pandas的矢量公式时多次迭代相同的数据。您不仅可以节省多次迭代数据的时间,还可以使用堆栈变量而不是堆(术语仅与编译的代码相关。Python将所有内容存储在堆中(。通过在Numba中使用堆栈变量,您基本上停止了不断地分配和释放内存。

另一种选择是在大循环之前预先分配变量,并在循环的每个itation中重用它们。但只有当每次迭代都有稳定的可变大小(在您的情况下,意味着每个CSV文件的行数(时,这才有帮助

最新更新