python-3.x - 将 numba 与 time.clock() 和 timeit 一起使用

标签 python-3.x numpy numba

我正在尝试在一个非常简单的示例上测试 numba 和 numpy 并检查效率。然而,

  1. 在 numba 的情况下,使用 time.clock 和 timeit 我得到非常不同的结果。

  2. 在 time.clock 的情况下,它表明将 numba 与 numpy 一起使用会使函数变慢。

  3. 对 NbNpFunc 使用 vectorize() 有意义吗?

这是我的代码。谢谢您的帮助。

import numpy as np
from numba import jit
import time
import timeit
#import math
#import matplotlib.pyplot as plt
#import matplotlib.animation as animation

N = 10000

def PyFunc(N):
    r = list(range(0,N)) 
    for i in range(0,len(r)):
            r[i] += r[i]*r[i]
    return(r)

def NpFunc(N):
    r = np.arange(0,N)
    r += r*r
    return(r)

@jit
def NbFunc(N):
    r = list(range(0,N))
    for i in range(0,len(r)):
        r[i] += r[i]*r[i]
    return(r)

@jit
def NbNpFunc(N):
    r = np.arange(0,N) 
    r += r*r
    return(r)

print("\nUsing time.clock()")
start_time = time.clock()
res1 = PyFunc(N)
print("PyFunc --- %s seconds ---"  %(time.clock() - start_time))    
start_time = time.clock()
res2 = NpFunc(N)
print("NumPyFunc --- %s seconds ---" % (time.clock() - start_time))    
start_time = time.clock()
res3 = NbFunc(N)
print("NumbaFunc --- %s seconds ---" % (time.clock() - start_time))    
start_time = time.clock()
res4 = NbNpFunc(N)
print("NumbaNpFunc --- %s seconds ---" % (time.clock() - start_time))    

print("\nUsing timeit")
t = timeit.Timer(lambda: PyFunc(N))
print ("PyFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NpFunc(N))
print ("NumPyFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NbFunc(N))
print ("NumbaFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NbNpFunc(N))
print ("NumbaNpFunc --- %s seconds ---" %t.timeit(number=1))

最佳答案

你的基准有几个问题

  • 在衡量性能之前,您必须调用每个函数一次。否则你就是在衡量编译开销
  • 计时器不是那么精确,您必须多次运行每个函数
  • 即使这样结果也可能不同,因为您的函数运行时间非常短,在这种情况下函数调用开销可能是个问题
  • 您并没有真正衡量计算速度。内存分配是代码中成本最高的部分。内存分配的时间在很大程度上受到垃圾收集器和内核在基准时间必须做的其他事情的影响

关于更好的基准测试的建议

  • 预先分配内存

  • 创建运行时间更长的代码(增加 N)

  • 在您的代码中进行更多计算(sin、cos、sqrt),在对简单乘法进行基准测试的情况下,您正在对 RAM 速度和缓存速度进行基准测试

  • 看看 nb.njit(fastmath=True)

  • 确保拥有最新的 Numba 版本并已安装 Intel SVML

关于python-3.x - 将 numba 与 time.clock() 和 timeit 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50038584/

相关文章:

python - 下载 PyQt5 和 Pytube 时 GUI 卡住

python - os.getlogin() 和 os.environ 获取用户名的区别

python - 如何计算跨列列表中元素的平均值?

python - 定义cython类内部函数的参数和cython中的快速积分计算

python - 在 numba nopython 函数中计算阶乘的最快方法

python - Django:将自定义管理器添加到 auth.User 时不创建迁移

python - 在Python中,使用元类来添加和删除许多类属性是否可以接受?

python - 将列表数组转换为 Keras 输入

python - Numba @jit 无法优化简单函数

python - “模块”不能用 numba 的 jit 编译器调用