如何提高这个程序的效率?

时间:2013-10-13 19:00:20

标签: python optimization python-2.7 performance

以下程序的运行时间(在函数内部)是110.726383227秒

如果我运行相同的程序而没有将它包装在一个函数(素数)中,它的运行时间是222.006502634秒

通过将其包装在一个函数中,我取得了显着的性能提升。

还有什么可能提高这个程序的效率吗?

# This is a program to find sum of prime numbers till 2 billion

def prime():
import time
start_time = time.clock()

num = 2
j=1
tot_sum = 0

for num in xrange(2,2000000): 
    count = 0
    for j in xrange(1,int(num**0.5)+1): # checking from 1 to sqrt(n)+1
        if(num % j == 0):
            count = count+1

    if(count == 1):
        tot_sum = tot_sum + num

print "total sum is %d" % tot_sum

print time.clock() - start_time, "seconds"

2 个答案:

答案 0 :(得分:1)

如果你想在没有外部库的情况下解决它,你可以做出一些明显的改进:

def prime():
    import time
    start_time = time.clock()

    tot_sum = 2

    for num in xrange( 3, 2000000, 2 ): 
            isPrime = True
            for j in xrange(3, int( num ** 0.5 ) + 1, 2 ):
                if( num % j == 0 ):
                    isPrime = False
                    break

            if isPrime:
                tot_sum = tot_sum + num

    print "total sum is %d" % tot_sum

    print time.clock() - start_time, "seconds"

prime()

不检查超过2个偶数,如果找到则不检查所有除数。您的原始代码在我的机器上运行172.924809秒,而我的运行时间为8.492169秒。

如果允许使用外部库,我建议gmpy2

def prime():
    from gmpy2 import is_prime
    import time
    start_time = time.clock()

    print "total sum is %d" % (sum(filter(is_prime, xrange(3,2000000,2)))+2)

    print time.clock() - start_time, "seconds"

prime()

这在1.691812秒内运行

答案 1 :(得分:0)

这可能与python如何解析变量有关。粗略地说,当你输入一个函数时,python会创建一个新的命名空间,它实际上映射到该函数的所有局部变量。然后,Python可以使用命名空间来确定程序员正在访问的所有变量的值。变量名称解析的顺序如下:

  • 在本地命名空间中查找变量名称
  • 在全局命名空间中查找变量名称
  • 在python的内置插件中查找名称。

执行查找可能很昂贵,并且Python中的一般性能提示仅为use local variables,原因如下:至少,它将避免执行两次查找而不是一次查找。此外,较新的python编译器似乎也在进行额外的优化以删除单个lookup into the local namespace,但只是将变量视为立即值。

测试这种优化是否仅仅因为命名空间查找而发生的一种好方法可能是(除非我不知道的其他优化)将所有逻辑包装在一个函数中,而是将所有变量都包含在你的函数中使用全球。如果一切都变慢了,你可能会猜到这是占用了很长时间的命名空间查找。