Python迭代速度慢

时间:2015-10-24 16:58:07

标签: python optimization

我制作了以下代码:

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

我认为代码所做的是为所有id≤n

添加i和d的最大公约数

由于"打印i",我意识到当我很小时,第二个循环很慢。这是为什么?,我该如何优化?

我看到d上的迭代会更大,但不应该只是迭代所有的值,而对于较大的i,第三个循环应该花费更长的时间,因为更大的X。

2 个答案:

答案 0 :(得分:0)

对于小的i值,第二个循环可能会变慢吗,因为xrange“跨越”了较小的i值?

我的意思是,在第二个循环声明中我们有:

表示x in x(i,n / i + 1):

对于小i,xrange的最大值(这是,n / i + 1)更大(商i / i在i = 1时最大,然后减小

答案 1 :(得分:0)

您对每个循环相对于彼此运行一次所需的时间的想法是准确的,但它们之间的差异很小。

您对每个循环运行次数的假设是偏离了几个数量级。

循环i正在执行~3000次。每个i调用的循环执行总数各不相同,但平均下降速度很快。在开始时,d循环被称为每个10,000,000,然后它很快就会下降:

为i [0:215]运行的循环总数大于i [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