這主要是一個學習Python的練習。我寫了這個功能來測試一個數是否爲素數:任何表演()
def p1(n):
for d in xrange(2, int(math.sqrt(n)) + 1):
if n % d == 0:
return False
return True
然後我意識到,我可以很容易地使用任何()重寫一遍:
def p2(n):
return not any((n % d == 0) for d in xrange(2, int(math.sqrt(n)) + 1))
性能的角度來看,我期待P2是比,或者至少是一樣快,快,P1因爲任何()是內置的,但對於一個大十歲上下的壯年,P2是一個相當慢一點:
$ python -m timeit -n 100000 -s "import test" "test.p1(999983)"
100000 loops, best of 3: 60.2 usec per loop
$ python -m timeit -n 100000 -s "import test" "test.p2(999983)"
100000 loops, best of 3: 88.1 usec per loop
我使用的任何()不正確地在這裏?有沒有辦法使用any()編寫這個函數,這樣它就像迭代自己一樣?
更新:編號爲更大的首要
$ python -m timeit -n 1000 -s "import test" "test.p1(9999999999971)"
1000 loops, best of 3: 181 msec per loop
$ python -m timeit -n 1000 -s "import test" "test.p2(9999999999971)"
1000 loops, best of 3: 261 msec per loop
看到https://docs.python.org/2/library/functions.html#any它看起來很像你寫的東西。 – njzk2 2014-10-26 22:24:29
@rightføld增加50%是一個小小的差異? – Barmar 2014-10-26 22:28:01
不是,但<1000次迭代是一個足夠小的數字,以至於與循環體相比,幾個額外的堆棧幀(更不用說當時在計算機中其他地方發生的事情)仍然很重要。 – 2014-10-26 22:31:57