寫了一篇關於一些python編碼風格的博客文章,發現了一些我覺得很奇怪的東西,我想知道是否有人明白它發生了什麼。基本上我有兩個版本的相同功能:爲什麼這個lambda函數比for循環版本更復雜?
a = lambda x: (i for i in range(x))
def b(x):
for i in range(x):
yield i
而我想比較這兩個剛剛建立的性能。在我的腦海裏這應該涉及到計算的微不足道的金額與方法應拿出相當接近零,但是,當我居然跑使用timeit:
def timing(x, number=10):
implicit = timeit.timeit('a(%s)' % int(x), 'from __main__ import a', number=number)
explicit = timeit.timeit('b(%s)' % int(x), 'from __main__ import b', number=number)
return (implicit, explicit)
def plot_timings(*args, **kwargs):
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
x_vector = np.linspace(*args, **kwargs)
timings = np.vectorize(timing)(x_vector)
ax.plot(x_vector, timings[0], 'b--')
ax.plot(x_vector, timings[1], 'r--')
ax.set_yscale('log')
plt.show()
plot_timings(1, 1000000, 20)
我得到的兩種方法之間的巨大差異,如下圖所示:
凡a
是藍色的,b
是紅色。
爲什麼差異那麼大?它看起來明確的for循環版本也是對數增長,而隱式版本什麼都不做(因爲它應該)。
有什麼想法?
什麼軸呢? –
我認爲你在幾個陳述中倒退了?拉姆達版本是對數增長的版本。 – roippi