我会理解 numpy 是否足够聪明,可以看到
array % 1
不执行任何操作,并且运行时独立于输入。我还想知道对于较大的数字,运行时间是否会更长,可能是因为除以较大的数字需要更长的时间(比较为什么Python中的浮点除法对于较小的数字更快?)。但为什么 array % 1
对于较小的数字来说运行时间更长?
from timeit import timeit
import numpy as np
a1 = np.random.randint(500, size=20_000_000, dtype=np.int32) - 250
a2 = np.random.randint(20_000_000, size=20_000_000, dtype=np.int32) - 250
print(timeit(lambda: a1 % 1, number=5))
print(timeit(lambda: a2 % 1, number=5))
print(timeit(lambda: a1 % 1, number=5))
print(timeit(lambda: a2 % 1, number=5))
输出:
0.4755298000000039
0.19294559999980265
0.460197700000208
0.19560679999995045
Numpy 信息:
{'numpy_version': '2.0.0',
'python': '3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 '
'64 bit (AMD64)]',
'uname': uname_result(system='Windows', node='hostname', release='11', version='10.0.22631', machine='AMD64')},
{'simd_extensions': {'baseline': ['SSE', 'SSE2', 'SSE3'],
'found': ['SSSE3',
'SSE41',
'POPCNT',
'SSE42',
'AVX',
'F16C',
'FMA3',
'AVX2',
'AVX512F',
'AVX512CD',
'AVX512_SKX',
'AVX512_CLX',
'AVX512_CNL',
'AVX512_ICL'],
'not_found': []}}]
所以对于这种情况有很多答案,但据我所知应该是,
您能做的最好的事情就是使用外部工具来分析并检查。有一个可以与 python 一起使用的工具,称为 cProfile,我很少使用它,但要实现它非常简单。
您可以使用下面的代码来对此进行分析。
def profile_code():
a1 % 1
a2 % 1
cProfile.run('profile_code()', 'output.pstats')
p = pstats.Stats('output.pstats')
p.sort_stats('cumulative').print_stats(10)