|
From: <las...@si...> - 2011-11-22 14:58:55
|
Thanks, Paul, for explain why to calculate fib in this way is bad.
I try to use pycxx, because I thought it is a tool to write py extension. And as for extension, before this example, I always thought it is used to speed the py source.
I tried some tools, and got a table. In this table, the speed is calculated in second.
As we can see:
1. no matter cython, swig, pyinline or shedskin, they compiled C/C++ source into PYD. and all the PYDs give a great increase in speed
2. pycxx compiled C++ source into PYD too, but this PYD is even slower than a pure python function heavily!
so from this example, I conclude that pycxx is only for the aim "to write python exteison in C++ easily", but not for the aim "to speed up the original pure python program". Am I right?
M | pure py |cython | swig | pycxx | cinpy | pyinline | psyco | shedskin
---+----------+---------+------+---------+--------+---------+--------+-----------
40 | 116.64 | 3.70 | 5.40 | 789.81 | 4.00 | 4.66 | 6.22 | 3.50
30 | 0.93 | 0.03 | 0.03 | 6.35 | 0.03 | 0.03 | 0.05 | 0.03
I don't want to list all the source files I used here, because they are all recursion function, and have the almost same and simple source code structure as the following codes.
[pure py]
def fib(n):
if n<=1:
return 1
else:
return fib(n-1)+fib(n-2)
M=30
st=time.time()
for i in range(M):
fib(i)
et=time.time()
print fib(M)
print 'time: %.2f secs' % (et-st)
[/pure py]
[test_pyinline]
import time
import PyInline, __main__
m = PyInline.build(code="""
long fib(int a) {
if (a<2) return 1;
return fib(a-2)+fib(a-1);
}""",
targetmodule=__main__, language="C")
M=30
st=time.time()
for i in range(M):
fib(i)
et=time.time()
print fib(M)
print 'time: %.2f secs' % (et-st)
[/test_pyinline] |