Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,计算小于非负数n的素数_Python_Math_Time Complexity_Primes - Fatal编程技术网

在Python中,计算小于非负数n的素数

在Python中,计算小于非负数n的素数,python,math,time-complexity,primes,Python,Math,Time Complexity,Primes,我在解决一个编码问题,在这个问题上,我们应该计算素数的个数小于一个非负数,n 这是我的解决方案: class Solution(object): def isPrime(self, Number): return 2 in [Number, 2**Number % Number] def countPrimes(self, n): """ :type n: int :rtype: int """

我在解决一个编码问题,在这个问题上,我们应该计算素数的个数小于一个非负数,n

这是我的解决方案:

class Solution(object):

    def isPrime(self, Number):
        return 2 in [Number, 2**Number % Number]

    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        count_prime = 0
        prime_range = filter(lambda x: x % 2 != 0 and x % 3 != 0 and x % 5 != 0, xrange(n))

        for i in prime_range:
            if self.isPrime(i):
                count_prime += 1

        return count_prime

print Solution().countPrimes(499979)
虽然这适用于较小的数字,但对于较大的数字需要花费大量的时间,我不确定在我的程序中哪个部分花费了更多的时间?这里我只测试大于100的数字

谁能帮我找出哪个部分需要更多时间


你看了埃拉托什尼筛吗?这是寻找素数的经典算法:

Eratosthenes筛是一个简单的算法,它可以找到一个给定整数的素数。实现该算法,只允许外循环在极限的平方根处停止,内循环在刚找到的素数的平方处开始。这尤其意味着,您不应该通过使用预先计算的控制盘进行优化,也就是说,不要假设您只需要删除奇数(基于2的控制盘)、等于1或5模6的数(基于2和3的控制盘)或基于低素数的类似控制盘


你看过埃拉托斯坦筛吗?这是寻找素数的经典算法:

Eratosthenes筛是一个简单的算法,它可以找到一个给定整数的素数。实现该算法,只允许外循环在极限的平方根处停止,内循环在刚找到的素数的平方处开始。这尤其意味着,您不应该通过使用预先计算的控制盘进行优化,也就是说,不要假设您只需要删除奇数(基于2的控制盘)、等于1或5模6的数(基于2和3的控制盘)或基于低素数的类似控制盘

谁能帮我找出哪个部分需要更多时间

为什么是这样,Python可以。简而言之,Python附带了一个Python代码探查器。在其下运行模块会产生以下统计信息:

jim@jim: python -m cProfile tt.py 
673
         6311 function calls in 0.016 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.016    0.016 tt.py:1(<module>)
        1    0.000    0.000    0.000    0.000 tt.py:1(Solution)
     4979    0.002    0.000    0.002    0.000 tt.py:12(<lambda>)
     1327    0.013    0.000    0.013    0.000 tt.py:3(isPrime)
        1    0.000    0.000    0.016    0.016 tt.py:6(countPrimes)
        1    0.001    0.001    0.003    0.003 {filter}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
总共花费了
0.013/0.016
总时间
1327次
通话。是的,这就是问题所在

现在,在您发现瓶颈所在后,您可以尝试找到优化的方法。大多数情况下,只要使用更高效的算法和合适的数据结构,就可以获得更好的性能

<>如果你想最快地快一点,考虑一下类似的事情。如果这些不削减它写一个纯粹的
C
扩展可能会运行得更快一些。如果这还不能解决问题,那就放弃吧,因为你对任何事情都不满意

谁能帮我找出哪个部分需要更多时间

为什么是这样,Python可以。简而言之,Python附带了一个Python代码探查器。在其下运行模块会产生以下统计信息:

jim@jim: python -m cProfile tt.py 
673
         6311 function calls in 0.016 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.016    0.016 tt.py:1(<module>)
        1    0.000    0.000    0.000    0.000 tt.py:1(Solution)
     4979    0.002    0.000    0.002    0.000 tt.py:12(<lambda>)
     1327    0.013    0.000    0.013    0.000 tt.py:3(isPrime)
        1    0.000    0.000    0.016    0.016 tt.py:6(countPrimes)
        1    0.001    0.001    0.003    0.003 {filter}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
总共花费了
0.013/0.016
总时间
1327次
通话。是的,这就是问题所在

现在,在您发现瓶颈所在后,您可以尝试找到优化的方法。大多数情况下,只要使用更高效的算法和合适的数据结构,就可以获得更好的性能


<>如果你想最快地快一点,考虑一下类似的事情。如果这些不削减它写一个纯粹的
C
扩展可能会运行得更快一些。如果这还不能解决问题,那就放弃吧,因为你对任何事情都不满意。

谢谢!但是我的程序有什么问题?它应该运行得足够快,可以计算所有小于
n
的素数,即使是较大的数。谢谢!但是我的程序有什么问题?它应该运行得足够快,可以计算所有小于
n
的素数,即使是较大的数。顺便说一句,341是最小的费马伪素数。它是复合的最小正数,但您的
isPrime
函数返回的是
True
。您可能需要研究Python的3参数形式。阅读伪素数、强伪素数、卡迈克尔数和埃拉托什尼筛。1387、1729、2047、2701、2821、3277、4033、4369、4681、5461、6601、7957、8321,8911对于您的iPrimenote来说是更多的误报,在Eratosthenes实现的筛选中,您根本不需要
iPrime
:将
if self.isPrime(i):
替换为
if total_prime[i]:
(并删除
total_prime[i]=True
行:这是多余的)。请不要在帖子中添加您的答案。考虑创建一个新的答案并解释你在这个答案中所执行的步骤。在本例中,我已回滚编辑。下次小心点。RegardsBtw,341是最小的费马伪素数。它是复合的最小正数,但您的
isPrime
函数返回的是
True
。您可能需要研究Python的3参数形式。阅读伪素数、强伪素数、卡迈克尔数和埃拉托什尼筛。1387、1729、2047、2701、2821、3277、4033、4369、4681、5461、6601、7957、8321,8911对于您的iPrimenote来说是更多的误报,在Eratosthenes实现的筛选中,您根本不需要
iPrime
:将
if self.isPrime(i):
替换为
if total_prime[i]:
(并删除
total_prime[i]=True
行:这是多余的)。请不要在帖子中添加您的答案。考虑创建一个新的答案并解释你在这个答案中所执行的步骤。在本例中,我已回滚编辑。下次小心点。谢谢你![Number,2**Number%Number]中的
2不应该需要固定的时间吗?你知道为什么这个函数需要更多的时间吗。@python:value
2**Number
的位数与
Number
成比例(实际上,在bas中等于
Number+1