// Dll1.c#include"pch.h"intfib(int n){if(n <=2)return1;returnfib(n -1)+fib(n -2);}inttestfib(int value,int n){int t =0;for(int i =1; i < n +1; i++)// 加个条件判断,防止固定语句被编译器优化掉if(i %2)
t =fib(value +(i %2));else
t =fib(value +(i %3));return t;}
用 Python 调用C函数
from ctypes import*import time
deffib(n):if n <=2:return1return fib(n -1)+ fib(n -2)deftestfib(value, n):
t =0for i inrange(1, n +1):if i %2:
t = fib(value +(i %2))else:
t = fib(value +(i %3))return t
path ="./Dll1.dll"
num =15
repeat =500000
dll = cdll.LoadLibrary(path)
dll.fib.retype = c_int
dll.testfib.retype = c_int
# 调用 C 函数
st = time.time()*1000
t = dll.testfib(num, repeat)print("dll.testfib(): %.3f ms, final: %d"%(time.time()*1000- st, t))# 循环调用 C 函数 fib(),实现与 testlib() 相同逻辑
st = time.time()*1000for i inrange(1, repeat +1):if i %2:
t = dll.fib(num +(i %2))else:
t = dll.fib(num +(i %3))print("dll.fib(): %.3f ms, final: %d"%(time.time()*1000- st, t))# 纯 Python
st = time.time()*1000
t = testfib(num, repeat)print("Python: %.3f ms, final: %d"%(time.time()*1000- st, t))
Cython
%%cython -f
import time
cpdef int fib(int n):if n <=2:return1return fib(n -1)+ fib(n -2)
cpdef int testfib(int value,int n):
cdef int t =0
cdef int i =0for i inrange(1, n +1):# 加个条件判断,防止固定语句被优化掉if i %2:
t = fib(value +(i %2))else:
t = fib(value +(i %3))return t
st = time.time()*1000
t = testfib(15,500000)print("cython: %.3f ms, final: %d"%(time.time()*1000- st, t))