为什么对于较小的数字,`array % 1` 的运行速度比较大的数字慢 150%?

问题描述 投票:0回答:1

我会理解 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': []}}]
numpy performance modulo
1个回答
0
投票

所以对于这种情况有很多答案,但据我所知应该是,

  • CPU 缓存或分支预测
  • 数据如何分布
  • 矢量化区域
  • 或者主要问题是潜在的类型转换

您能做的最好的事情就是使用外部工具来分析并检查。有一个可以与 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)
© www.soinside.com 2019 - 2024. All rights reserved.