首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地C代码对Python+Numba的LLVM性能

本地C代码对Python+Numba的LLVM性能
EN

Stack Overflow用户
提问于 2021-02-16 08:31:07
回答 1查看 321关注 0票数 0

最近,我在Python中做了一些性能优化测试。其中一部分是使用SWIG对Monte计算进行基准测试,并编译一个库以便在Python中导入。另一个解决办法是使用Numba。现在,我完全想知道为什么本机C解决方案比Numba差,即使LLVM编译器用于这两种情况。所以我想知道我是不是做错了什么。

在我的笔记本电脑上运行

代码语言:javascript
复制
native C module: 7.09 s
Python+Numba:    2.75 s

本机C代码

代码语言:javascript
复制
#include "swigtest.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

float monte_carlo_pi(long nsamples)
{
    int accGlob=0;
    int accLoc=0;
    int i,ns;
    float x,y;
    float res;
    float iRMX=1.0/(float) RAND_MAX;
    
    srand(time(NULL));
    
    for(i=0;i<nsamples;i++)
    {
      x = (float)rand()*iRMX;
      y = (float)rand()*iRMX;

      if((x*x + y*y) < 1.0) { acc += 1;}      
    }    
      
    res = 4.0 * (float) acc / (float) nsamples;
      
    printf("cres = %.5f\n",res);
    
    return res;
}

swigtest.i

代码语言:javascript
复制
%module swigtest

%{
#define SWIG_FILE_WITH_INIT
#include "swigtest.h"
%}

float monte_carlo_pi(long nsamples);

编译器调用

代码语言:javascript
复制
clang.exe swigtest.c swigtest_wrap.c -Ofast -o _swigtest.pyd -I C:\python37\include -shared -L c:\python37\libs -g0 -mtune=intel -msse4.2 -mmmx

testswig.py

代码语言:javascript
复制
from swigtest import monte_carlo_pi
import time
import os

start = time.time()
   
pi = monte_carlo_pi(250000000)

print("pi: %.5f" % pi)
print("tm:",time.time()-start)

带有Numba的Python版本

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

start = time.time()

@jit(nopython=True,cache=True,fastmath=True)
def monte_carlo_pi(nsamples: int)-> float:
    acc:int = 0
    for i in range(nsamples):
        x:float = random.random()
        y:float = random.random()
        if (x * x + y * y) < 1.0: acc += 1
        
    return 4.0 * acc / nsamples
    
pi = monte_carlo_pi(250000000)

print("pi:",pi)
print("tm:",time.time()-start)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 11:12:57

到目前为止的总结:

rand()函数似乎消耗了大部分时间。使用这样的确定性方法

代码语言:javascript
复制
...
ns     = (long) sqrt((double)nsamples)+1;
dx     = 1./sqrt((double)nsamples);
dy     = dx;
...
for(i=0;i<ns;i++)
          for(k=0;k<ns;k++)
          {
            x = i*dx;
            y = k*dy;

            if((x*x + y*y) < 1.0) { accLoc += 1;}      
          }  
...

而不是rand()导致只执行0.04 s!显然,Numba使用了另一个更有效的随机函数。

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

https://stackoverflow.com/questions/66220933

复制
相关文章

相似问题

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