# 一行代码让python的运行速度提高100倍

38 篇文章 29 订阅

import time

def foo(x, y):
tt = time.time()
s = 0
for i in range(x, y):
s *= i
print('time:{}'.format(time.time() - tt))
return s

print(foo(1,100000000))


time:8.983859300613403


import numba as nu
import time
@nu.jit()
def foo(x, y):
tt = time.time()
s = 0
for i in range(x, y):
s *= i
print('time:{}'.format(time.time() - tt))
return s

print(foo(1,100000000))


time:0.16590428352355957


##### 如何使用numba
import numba as nb

##### 只用1行代码即可加速，对loop有奇效

numba可以把各种具有很大loop的函数加到很快的速度，但numpy的加速只适用于numpy自带的函数。

import numba as nb
import numpy as np
import time
# 用numba加速的求和函数
@nb.jit()
def nb_foo(x, y):
tt = time.time()
s = 0
for i in range(x, y):
s += i
print('time:{}'.format(time.time() - tt))
return s

print(nb_foo(1,100000000))
# 没用numba加速的求和函数
def py_foo(x, y):
tt = time.time()
s = 0
for i in range(x, y):
s += i
print('time:{}'.format(time.time() - tt))
return s

print(py_foo(1,100000000))

a = list(range(100000000)) # 创建一个长度为100000000的数组

start = time.time()
np.sum(a) # numpy自带的求和函数
end = time.time()
print(end-start)

start = time.time()
sum(a) # python自带的求和函数
end = time.time()
print(end-start)


time:0.06898283958435059	# numba加速的求和函数
4999999950000000
time:10.004251480102539		# 没加速的求和函数
4999999950000000
9.993287086486816		#numpy自带的求和函数
4.011701583862305		# python自带的求和函数


from math import sin

@nb.vectorize()
def nb_vec_sin(a):
return sin(a)


##### 更多numba的加速选项

​ @nb.jit(nopython=True,fastmath=True) 牺牲一丢丢数学精度来提高速度
​ @nb.jit(nopython=True,parallel=True) 自动进行并行计算


import numba as nb
import time

@nb.autojit()
def nb_sum(a):
start = time.time()
Sum = 0
for i in range(len(a)):
Sum += a[i]
end = time.time()
return end-start


autoit虽然可以根据参数类型动态地产生机器码函数，但是由于它需要每次检查参数类型，因此计算速度也有所降低。numba的用法很简单，基本上就是用jit和autojit这两个修饰器，和一些类型对象。下面的程序列出numba所支持的所有类型：

print [obj for obj in nb.__dict__.values() if isinstance(obj, nb.minivect.minitypes.Type)]
[size_t, Py_uintptr_t, uint16, complex128, float, complex256, void, int , long double,
unsigned PY_LONG_LONG, uint32, complex256, complex64, object_, npy_intp, const char *,
double, unsigned short, float, object_, float, uint64, uint32, uint8, complex128, uint16,
int, int , uint8, complex64, int8, uint64, double, long double, int32, double, long double,
char, long, unsigned char, PY_LONG_LONG, int64, int16, unsigned long, int8, int16, int32,
unsigned int, short, int64, Py_ssize_t]

##### Numba的精度问题

numba具有C所有的数据类型，比如对上面的求和函数，只需要把@nb.jit()改为@nb.jit(nb.int64(nb.int32[:]))即可。nb.int64是说输出的数字为int64类型，nb.int32是说输入的数据类型为int32，而[:]是说输入的是数组。

https://zhuanlan.zhihu.com/p/60994299
https://blog.csdn.net/qq_39241986/article/details/102486661

• 2
点赞
• 10
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。