Python专题, 语言

Numba加速Python的时间测试

Numba官网:http://numba.pydata.org/

Numba对for循环处理Numpy数组有很大的加速效果,推荐使用。但Numba支持的函数有限,同时也容易产生错误,因此需要谨慎调用,多做测试。

简单的使用方法(在函数前增加@jit):

from numba import jit
@jit
def f(x):
    return x**2

一个for循环的测试例子:

import numpy as np
from numba import jit
import time

def for_sum(numpy_array):
    sum = 0
    for number in numpy_array:
        sum += number
    return sum

@jit
def numba_for_sum(numpy_array):
    sum = 0
    for number in numpy_array:
        sum += number
    return sum

numpy_array = np.arange(0,1e8,1)

start = time.time()
result = sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('python中sum()函数求和时间:\n', end - start)

start = time.time()
result = np.sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('numpy.sum()函数求和时间:\n', end - start)

start = time.time()
result = for_sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('for循环求和numpy数组的时间:\n', end - start)

start = time.time()
result = numba_for_sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('numba加速for循环求和numpy数组的时间:\n', end - start, '\n')

运行结果:

result: 4999999950000000.0
python中sum()函数求和时间:
 11.673642873764038

result: 4999999950000000.0
numpy.sum()函数求和时间:
 0.12153196334838867

result: 4999999950000000.0
for循环求和numpy数组的时间:
 15.565314054489136

result: 4999999950000000.0
numba加速for循环求和numpy数组的时间:
 0.28093886375427246

对于求和的过程明显可以直接使用numpy.sum(),但Numba加速可适用于普遍的for循环处理Numpy数组的情况。在实际应用中,Numba是否能起到有效加速需要做具体的代码测试和时间测试,同时也可查阅官方的文档说明。

另外一个例子:

(1)这样写会报错:

@jit
def numba_for_sum():
    sum = 0
    for i0 in range(2):
        sum = sum + np.array([1, 2])

(2)这样写是运行正确:

@jit
def numba_for_sum():
    sum = np.zeros(2)
    for i0 in range(2):
        sum = sum + np.array([1, 2])

(3)而在这种没有迭代的情况下,数组的广播能力又恢复了,不会报错:

@jit
def numba_for_sum():
    sum = 0
    sum = sum + np.array([1, 2])

这应该跟numba的运行机制有关,得一步步代码做测试。如果直接把原先的代码加一个@jit,大概率会出问题。

参考资料:

[1] http://numba.pydata.org/

[2] 如何用numba加速python?

[3] numba从入门到精通(1)—为什么numba能够加速

[4] numba,让python速度提升百倍

567 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

评论说明:
(1)在保留浏览器缓存的前提下,目前支持72小时自主修改或删除个人评论。如果自己无法修改或删除评论,可再次评论或联系我。如有发现广告留言,请勿点击链接,博主会不定期删除。
(2)评论支持Latex公式。把latexpage作为标签放在任何位置,评论中的公式可正常编译,示例:
$Latex formula$  [latexpage]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注