You probably want to use timeit
module with similar setup:
run.py
from itertools import combinations
def combinations_3(ary):
l = len(ary)
for i in xrange(l-2):
for j in xrange(i+1, l-1):
for k in xrange(j+1, l):
yield (ary[i], ary[j], ary[k])
def _test(generator):
for combination in generator:
#: To meger time of sequence generation we should ommit IO operations.
pass
def test_lib(lenght=10000):
_test(combinations(list(range(1, lenght)), 3))
def test_self_written(lenght=10000):
_test(combinations_3(list(range(1, lenght))))
test.py
import timeit
#: Print title
print(' library time self written time')
#: Counter of sequence number.
for i in list(range(10, 100, 10)):
#: Meger execution time for self written combinations implementation.
self_written = timeit.Timer(
#: Tested expression.
'test_lib({})'.format(i),
#: Test setup, here we just import tested function.
'from run import test_self_written as test_lib'
).timeit(1000) #: And here we just set number of testing iterations.
lib = timeit.Timer(
'test_lib({})'.format(i),
'from run import test_lib'
).timeit(1000)
#: Print output in format "<number of elements>: library time, self written time"
print('{:03} elements: {:10.6f} {:10.6f}'.format(i, lib, self_written))
And here is my output:
$ python2 test.py
library time self written time
010 elements: 0.007060 0.030495
020 elements: 0.058317 0.239376
030 elements: 0.211884 0.817189
040 elements: 0.522477 1.903142
050 elements: 1.047018 3.803112
060 elements: 1.969069 6.590189
070 elements: 2.960615 10.500072
080 elements: 4.468489 15.176092
090 elements: 6.402755 21.669669
$ python3 test.py
library time self written time
010 elements: 0.009168 0.038298
020 elements: 0.058049 0.285885
030 elements: 0.208938 1.031432
040 elements: 0.523407 2.450311
050 elements: 1.048463 4.796328
060 elements: 1.828277 7.832434
070 elements: 2.970929 13.067557
080 elements: 4.481792 18.496334
090 elements: 6.353836 26.277946
$ pypy test.py
library time self written time
010 elements: 0.011924 0.040272
020 elements: 0.056972 0.046638
030 elements: 0.185858 0.083793
040 elements: 0.456202 0.188640
050 elements: 0.913935 0.338211
060 elements: 1.588666 0.542124
070 elements: 2.537772 0.846942
080 elements: 3.816353 1.232982
090 elements: 5.471375 1.707760
And python versions
$ python2 -V && python3 -V && pypy -V
Python 2.7.6
Python 3.4.3
[PyPy 2.2.1 with GCC 4.8.2]
As you can see, pypy
is much faster than cpython
implementation. TBC