Python 是一个用途非常广泛的编程语言,拥有成千上万的第三方库,在人工智能、机器学习、自动化等方面有着广泛的应用,众所周知,Python 是动态语言,有全局解释器锁,比其他静态语言要慢,也正是这个原因,你也许会转向其他语言如 Java、C++。但是有个工具可以让Python比C++的速度还快,它就是Numba。
官方文档: https://numba.readthedocs.io/
Numba 是一个开源的即时编译器(JIT compiler),可将 Python 和 NumPy 的代码的转换为快速的机器码,从而提升运行速度。可以达到 C 或 FORTRAN 的速度。
- 怎么使用?
只需将 Numba 提供的装饰器放在 Python 函数上面就行,剩下的就交给 Numba 完成。举个简单的例子:
from numba import jit
import random
@jit(nopython=True)
def monte_carlo_pi(nsamples):
acc = 0
for i in range(nsamples):
x = random.random()
y = random.random()
if (x ** 2 + y ** 2) < 1.0:
acc += 1
return 4.0 * acc / nsamples
@numba.jit(nopython=True, parallel=True)
def logistic_regression(Y, X, w, iterations):
for i in range(iterations):
w -= np.dot(((1.0 /
(1.0 + np.exp(-Y * np.dot(X, w)))
- 1.0) * Y), X)
return w
- 同样的代码运行速度咋样?
- 1.C++代码
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
bool isPrime(int num) {
if (num == 2) return true;
if (num <= 1 || num % 2 == 0) return false;
double sqrt_num = sqrt(double(num));
for (int div = 3; div <= sqrt_num; div +=2){
if (num % div == 0) return false;
}
return true;
}
int run_program(int N){
int total = 0;
for (int i; i < N; i++) {
if(isPrime(i)) total ++;
}
return total;
}
int main()
{
int N = 10000000;
clock_t start,end;
start = clock();
int total = run_program(N);
end = clock();
cout << "total prime num is " << total;
cout << "\ncost " << (end - start) / ((double) CLOCKS_PER_SEC) << "s\n";
return 0;
}
运行结果:
C++运行时间:3.02s
- 2.Python代码
import math
import time
from numba import njit, prange
@njit
def is_prime(num):
if num == 2:
return True
if num <= 1 or not num % 2:
return False
for div in range(3, int(math.sqrt(num) + 1), 2):
if not num % div:
return False
return True
@njit(parallel = True)
def run_program(N):
total = 0
for i in prange(N):
if is_prime(i):
total += 1
return total
if __name__ == "__main__":
N = 10000000
start = time.time()
total = run_program(N)
end = time.time()
print(f"total prime num is {total}")
print(f"cost {end - start}s")
Python运行时间:2.06s
总结:Python也可以比其他语言更快,大家要有信心。