大数据的Python优化

时间:2014-11-04 15:05:29

标签: python

我想打印所有素数,连续7个连续7s小于10000000000。我在使用MemoryError时收到range()因为生成的数组无法存储,所以我将循环更改为while循环。

但是程序真的很慢。打印找到的第一个数字需要一分多钟。

import math

def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    i = 3
    while i < math.sqrt(n) + 1:
    #for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
        i += 2
    return True

def is_super_happy(n):
    count = 0
    while n != 0:
        if n%10 == 7:
            count += 1
            if count == 7:
                return True
        else:
            count = 0
        n /= 10
    return count == 7

i = 7777777
while i < 10e10:
#for i in range(7777777, int(10e10)):
    if is_super_happy(i) and is_prime(i):
        print i
    i += 1

我无法做任何可以让它变得更快的事情,而且我希望它能够非常快。

任何想法,提示?

3 个答案:

答案 0 :(得分:2)

您当前的算法非常浪费:is_prime会在每次迭代时检查从1到sqrt(n)的每个数字,而它应该只检查已知的素数。

修改算法,使其实现http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

此外,您在while循环的每个刻度线上计算sqrt(n)(如果你变得足够高,可能会有几百万次),除非它没有变化。在函数开头计算一次并重用它。

答案 1 :(得分:2)

两个建议:

  • 直接生成小于10e10的7位,8位和9位数字(而不是依次检查每个数字),然后检查它们。这些数字的数量相对较少。

    例如,这是一种生成所有此类数字的列表的方法 end with'77777777': 7777777

  • 考虑使用概率检验来检查素性(例如Miller-Rabin)。这会告诉您一个数字[int(str(x)+'7777777') for x in xrange(100)]是否具有非常高概率的素数,并且可以更快地检查可能数千个小于x的数字以进行可分性。

答案 2 :(得分:0)

我在大约四分之一秒内找到250个素数,我不想提供我的代码,因为你的问题看起来像是家庭作业。

方法:

  • 首先,使用筛子找到所有低于10万的质数(即sqrt(您的最大数量))。
  • is_prime()只需要检查这些素数中的任何一个是否除以数字
  • 这些数字只有4000个;考虑数字000到999.它们可以通过四种方式与7777777结合使用;说123变为7777777123,1777777723,1277777773和1237777777.生成这些,检查它们是否与素数相对应,完成。
  • 使用字符串(int("12" + "7777777" + "3"))或仅使用数学(12 * 100000000 + 7777777 * 10 + 3)生成数字