首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numba减速码?

Numba减速码?
EN

Stack Overflow用户
提问于 2014-03-31 17:54:05
回答 1查看 172关注 0票数 1

我对通过使用这里获得numba的加速印象深刻

今天,我在这么一个问题中找到了一个希望加速他的代码的人。所以我想让我们看看我们可以用numba实现什么。

以下是代码:

代码语言:javascript
复制
from numba import autojit
from time import time

LIMIT = pow(10,6)

def primes(limit):
    # Keep only odd numbers in sieve, mapping from index to number is
    # num = 2 * idx + 3
    # The square of the number corresponding to idx then corresponds to:
    # idx2 = 2*idx*idx + 6*idx + 3
    sieve = [True] * (limit // 2)
    prime_numbers = set([2])
    for j in range(len(sieve)):
        if sieve[j]:
            new_prime = 2*j + 3
            prime_numbers.add(new_prime)
            for k in range((2*j+6)*j+3, len(sieve), new_prime):
                sieve[k] = False
    return list(prime_numbers)


numba_primes = autojit(primes)



start = time()
numba_primes(LIMIT)
end=time()
print("Numba: Time Taken : ",end-start)

start = time()
primes(LIMIT)
end=time()
print("Python: Time Taken : ",end-start)

结果:

代码语言:javascript
复制
('Numba: Time Taken : ', 0.68790602684021)
('Python: Time Taken : ', 0.12417221069335938)

为什么会发生这种情况?似乎有了numba,这段代码并没有变得更快!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-31 18:30:19

下面是一个Numba化版本(使用Numba0.13)--这是通过使用numpy数组进行优化的

代码语言:javascript
复制
import numpy as np
import numba

# You could also just use @numba.jit or @numba.jit(nopython=True)
# here and get comparable timings.
@numba.jit('void(uint8[:])', nopython=True)
def primes_util(sieve):
    ssz = sieve.shape[0]
    for j in xrange(ssz):
        if sieve[j]:
            new_prime = 2*j + 3
            for k in xrange((2*j+6)*j+3, ssz, new_prime):
                sieve[k] = False

def primes_numba(limit):
    sieve = np.ones(limit // 2, dtype=np.uint8)
    primes_util(sieve)

    return [2] + (np.nonzero(sieve)[0]*2 + 3).tolist()

然后与时间进行比较:

代码语言:javascript
复制
In [112]: %timeit primes(LIMIT)
1 loops, best of 3: 221 ms per loop

In [113]: %timeit primes_numba(LIMIT)
100 loops, best of 3: 11 ms per loop

In [114]:

a = set(primes(LIMIT))
b = set(primes_numba(LIMIT))

a == b
Out[114]:

True

这是一个20倍的加速比,虽然可能还有进一步的优化,可以进行。没有jit装饰师,numba版本在我的机器上运行约300 ms。对primes_util的实际调用只需要大约5毫秒,其余的是对np.nonzero的调用和对列表的转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22768709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档