【问题标题】:Python: faster implementation for loopPython:更快的循环实现
【发布时间】:2020-12-05 16:39:02
【问题描述】:

在这种情况下,我正在尝试以可变限制运行以下代码:

limit = 6000000
for i in range(limit):
           s[i] = some_function(i)

其中 some_function 是一个相对简单的函数,其中没有 for 循环(例如:2**i)。

我怎样才能让这个运行更快? (也许通过使用 numpy?)

【问题讨论】:

  • 如果你可以使用 numpy vecrotization,我认为更多关于这个函数到底能做什么的信息......
  • 如果目标是运行some_function 600 万次,没有更快的方法。
  • @mkrieger1 #parallelize #vectorize
  • 你能接受任何答案吗...

标签: python performance loops for-loop


【解决方案1】:

与 for 循环相比,这种使用 map() 的解决方案非常快

limit = 6000000
def some_function(i):
    return i**2
s=list(map(some_function,range(limit)))

【讨论】:

  • Numpy 的速度仍然是原来的两倍,但是.. 有趣的是,使用 map 也可以加快速度
【解决方案2】:

如果some_function 只是2**i 那么numpy 可以为您加快速度。您只需致电numpy.power

import numpy as np
elements = np.power(2, range(10000))

正如我之前的 Benoit Descamps 所建议的那样,使用多处理可以进一步加快速度。

from multiprocessing import Pool

def f(x):
  return x**2

p = Pool(5)
p.map(f, range(10000))

比较

多处理 VS numpy VS map VS for-loop

$ echo -e "from multiprocessing import Pool\ndef f(x):\n  return x**2\np = Pool(5)\np.map(f, range(10000))" | python -m timeit -n 1000
1000 loops, best of 5: 4.83 nsec per loop

$ python -m timeit -n 1000 'import numpy as np; np.power(2, range(10000))'
1000 loops, best of 5: 1.09 msec per loop

$ python -m timeit -n 1000 'list(map(lambda v: v**2, range(10000)))'
1000 loops, best of 5: 2.07 msec per loop

$ python -m timeit -n 1000 'import numpy as np; [np.power(2, i) for i in range(10000)]'
1000 loops, best of 5: 8.92 msec per loop

【讨论】:

    【解决方案3】:

    让我们尝试为您的示例提高一些速度...

    import nupmy as np 
    limit = 6000000
    s= np.arange(limit) 
    s = s**2 
    print(s[:10])
    

    当涉及到 python 循环速度时,使用 numpy vectorize 应该很重要,它是在使用 Cython 模块将部分代码转换为 c(或 c++,我不记得了......)

    【讨论】:

      【解决方案4】:

      如果循环很大并且您还有其他未使用的处理器,请检查 multiprocessing 库,因为这是 python 允许进程并行化的 hacky 方式。

      链接中的第一个例子就是你所需要的:

      from multiprocessing import Pool
      n_pools = 5 # You will need to  play with this number. Increase or decrease and check performance.
      with Pool(n_pools ) as p:
          print(p.map(some_function, range(limit)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多