首先,这里有另外两种编写函数的方法。
# this one's about the same speed
import itertools
def build_substrings_2(s):
return [''.join(r) for r in itertools.product(*(['',ch] for ch in s))]
# this one's about 4 times faster
def build_substrings_3(s):
res = [""]
for ch in s:
res += [r+ch for r in res]
return res
以下是测量速度的方法:
import matplotlib.pyplot as plt
from itertools import izip
import timeit
xs = range(3, 25)
fns = ['build_substrings_1', 'build_substrings_2', 'build_substrings_3']
res = [(fn, []) for fn in fns]
for i,s in ((chars,"a"*chars) for chars in xs):
ts = [
timeit.Timer(
'{}({})'.format(fn, repr(s)),
'from __main__ import {}'.format(fn)
)
for fn in fns
]
for t,r in izip(ts, res):
r[1].append(min(t.repeat(number=10)))
fig = plt.figure()
ax = fig.add_subplot(111, yscale='log')
for label,dat in res:
ax.plot(xs, dat, label=label)
legend = plt.legend(loc='upper left')
(y 轴是以秒为单位的运行时间日志,x 轴是以字符为单位的输入字符串的长度)
以下是您找到最佳多项式拟合的方法:
import numpy
data = [numpy.log10(r[1]) for r in res] # take log of data
best = [numpy.polyfit(xs[5:], dat[5:], 1) for dat in data] # find best-fit line
big_o = [10**(b[0]) for b in best] # convert slope back to power
(感谢 DSM 提供了这种简化的方法!)
这导致
[2.0099844256336676, 2.0731239717002787, 2.0204035253442099]
...您的功能约为 O(n**2.00998)