Python C擴充套件實踐 效能對比

2021-09-23 06:08:50 字數 2394 閱讀 7236

因為效能等一些原因,希望用c來擴充套件python。有多種方法,例如:

這裡闡述最後一種方式的實現。

首先需要 #include

需要實現下面三個函式:

static pyobject *funcname(pyobject *self, pyobject *args)

/* 函式定義 */

static pymethoddef methodslist

/* 方法對映 */

pymodinit_func initmodule()

/* module初始化(python3 module的定義和初始化略有不同,見下面示例**) */

完整**:

#include #include #define pi acos(-1)

#if py_major_version >= 3

#define py3k

#endif

void initcmath(void); /* forward */

main(int argc, char **ar**)

int fastfactorial(int n)

double calculatearea(float r)

static pyobject* factorial(pyobject* self, pyobject* args)

static pyobject* do_calculation(pyobject* self, pyobject* args)

static pymethoddef mainmethods = , ,

};#ifdef py3k

// module definition structure for python3

static pymoduledef cmath = ;

pymodinit_func pyinit_cmath(void)

#else

// module initializer for python2

pymodinit_func initcmath(void)

#endif

編譯(使用distutils):

from distutils.core import setup, extension

factorial_module = extension('cmath', sources=['cmath.c'])

setup(name='mathextension',

version='1.0',

description='this is a math package',

ext_modules=[factorial_module]

)

使用上面完整**中的calculatearea做運算效能對比,在python中做同樣實現:

import cmath

import timeit

import math

def do_calculation(r):

r1 = math.cos(r)

r2 = math.sin(r)

r3 = math.log10(r)

r4 = math.pi

r5 = 666.666

r = (((r1 + r2) - r3) * r4)/r5

return math.pi * r * r

if __name__ == '__main__':

print do_calculation(555.555)

print cmath.do_calculation(555.555)

# print sys.modules['__main__']

#radius = 666.666

num = 10000000

t = timeit.timer("cmath.do_calculation(%f)" % (radius), "import cmath")

print "c function", t.timeit(num), "sec"

t2 = timeit.timer("sys.modules['__main__'].do_calculation(%f)" % (radius))

print "python function", t2.timeit(num), "sec"

執行10000000次對比耗時:

ok,c實現的方案相同運算速度遠快於python實現,目的達到。

JS最佳實踐 效能優化

首先,由於js是一種解釋型語言,執行速度要比編譯型語言慢得多。注 chrome是第一款內建優化引擎,將js編譯成本地 的瀏覽器,其它瀏覽器也陸續實現了js的編譯過程。但是,即使到了編譯執行js的新階段,仍然會存在低效率的 以下總結一些可以改進 的整體效能的方法。記住一點,隨著作用域中的作用域數量的增...

python效能對比

1 coding utf8 import datetime road nodes for i in range 5000000 road nodes i beg time datetime.datetime.now for key,val in road nodes.items pass end t...

SSD效能對比

ssd效能測試 順序寫 16k iops 85061.08 順序寫 8k iops 146250.93 順序寫 4k iops 239816.69 順序寫 2k iops 294540.87 順序寫 1k iops 347170.06 隨機寫 16k iops 21865.24 隨機寫 8k iop...