2015-10-24 27 views
0

我做了下面的代碼:Python的迭代慢

from math import sqrt 
import time 


def factors(n):  
    x=(set(reduce(list.__add__, 
       ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))) 
    return sorted(x,reverse=True) 


n=10**7 
m=0 
start_time = time.time() 
for i in xrange(1,int(sqrt(n))+1): 
    l=0 
    x=factors(i) 
    for d in xrange(i,n/i+1): 
     if i==d: 
      l+=i 
     else: 
      for b in x: 
       if d%b==0: 
        l+=2*b 
        break 
    m+=l 
    print i 

elapsed_time = time.time() - start_time 
print elapsed_time 
print m 

我想代碼的作用是增加我的最大公約數和d所有id≤n

由於「打印我「,我已經意識到,當我很小時,第二個循環很慢。這是爲什麼?以及如何優化?

我發現d上的迭代將會更大,但不應該是迭代所有值,而對於更大的i,第三個循環應該花費更長的時間,因爲x的大小更大。

回答

0

對於我的小數值,第二個循環會慢一些嗎?只是因爲xrange「跨越」了一個較大數值的小i值?

我的意思是,在第二循環中聲明,我們有:

在x範圍d(I,N/I + 1):

而x範圍的最大值(這是,N/i + 1)對於小i更大(商i/1在i = 1時是最大的,然後它減小)

0

關於每個循環相對於彼此運行一次需要多長時間的想法是準確的,但它們之間的差異是最小的。

您對多少次eac h循環運行的時間是幾個數量級。

循環i正在執行〜3000次。每次調用的循環執行總次數有所不同,但平均下降速度很快。在開始時,d循環被稱爲〜10,000,000每i我然後它下降非常迅速:

您爲i [0:215]運行的循環總數大於[215:3161]

i    d_loops   b_loops   running_mean   avg_last_10_loops 
1    10000001  1    10000001.0    10000001.0 
2    5000001   2    10000001.5    10000001.5 
3    3333334   2    8888890.33333   8888890.33333 
4    2500001   3    8541668.5    8541668.5 
5    2000001   2    7633335.2    7633335.2 
6    1666667   4    7472224.0    7472224.0 
7    1428572   2    6812926.85714   6812926.85714 
8    1250001   4    6586311.5    6586311.5 
9    1111112   3    6224869.77778   6224869.77778 
10    1000001   4    6002383.2    6002383.2 
99    101011   6    1653200.16162   637628.2 
199    50252   2    1035550.34171   324231.5 
299    33445   4    779296.658863   203848.2 
399    25063   8    634848.313283   192922.4 
499    20041   2    540089.59519   149790.4 
599    16695   2    472549.51586   114461.6 
699    14307   4    421785.891273   103772.2 
799    12516   4    382086.017522   100739.8 
899    11124   4    349883.460512   80518.2 
999    10011   8    323351.570571   80530.4 
1099   9100   4    300961.77434   67638.0 
1199   8341   4    281811.0    61978.2 
1299   7699   4    265260.015396   65681.9 
1399   7148   2    250684.336669   54528.4 
1499   6672   2    237863.799199   49524.2 
1599   6254   8    226449.282051   56452.4 
1699   5886   2    216141.950559   47237.4 
1799   5559   4    206859.735964   43485.8 
1899   5266   6    198471.47762   49653.2 
1999   5003   2    190769.076538   38112.8 
2099   4765   2    183702.581706   34396.0 
2199   4548   4    177231.36653   36467.0 
2299   4350   6    171250.213136   35741.6 
2399   4169   2    165683.010838   34256.8 
2499   4002   12    160541.983994   39293.2 
2599   3848   4    155707.039246   35478.6 
2699   3706   2    151193.218229   27470.6 
2799   3573   6    146973.628796   30790.8 
2899   3450   4    143019.365643   29714.8 
2999   3335   2    139271.870957   28064.8 
3099   3227   4    135755.08777   27799.4 
3153   3172   4    133946.542341   33037.6 
3154   3171   8    133912.116677   30484.8 
3155   3170   4    133873.691284   29208.8 
3156   3169   12    133843.321926   29196.8 
3157   3168   8    133808.95407   30460.0 
3158   3167   4    133770.594047   29820.6 
3159   3166   12    133740.27477   32349.4 
3160   3165   16    133713.977215   25983.4 
3161   3164   4    133675.679848   25979.4 
3162   3163   16    133649.409235   27867.2