gpt4 book ai didi

python - 使用 %%timeit 测试性能,循环速度还是总时间更重要?

转载 作者:行者123 更新时间:2023-12-01 06:49:19 25 4
gpt4 key购买 nike

我用 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 notebook。

最佳答案

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

这种想法会导致对您的代码进行一项可能的改进:
请注意您分配了多少内存。
df['source'] = df['Close']可能意味着您将数据从一列复制到另一列。尽量重用数据。例如,做 col1 = df['Close']然后使用 col1进行进一步的操作。这样数据不会被复制并且速度更快(以防您不需要列 source 并且它是临时使用的)。

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

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

关于python - 使用 %%timeit 测试性能,循环速度还是总时间更重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60459490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com