鱼C论坛

 找回密码
 立即注册
查看: 1100|回复: 5

[技术交流] 【视频49课后作业】求2000000以内的素数之和

[复制链接]
发表于 2017-12-12 19:08:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 payton24 于 2017-12-12 19:10 编辑

这节主要讲生成器,如果抛开一定要用yield语句来生成generator的话。
感觉自建元组的生成器更容易理解,运行效率也差不多。

  1. ##生成2000000以内的循环数,step=1,start=0
  2. ##提取出素数
  3. ##判断循环数是否素数
  4. ##如果是素数,加入到sum里面。
  5. ##def get_prime():
  6.    
  7. import math
  8. def is_prime(number):
  9.     if number > 1:
  10.         if number == 2:
  11.             return True
  12.         if number % 2 == 0:
  13.             return False
  14.         for current in range(3, int(math.sqrt(number) + 1), 2):
  15.             if number % current == 0:
  16.                 return False
  17.         return True
  18.     return False
  19.    
  20. def main():
  21.     sum=0
  22.     nums = (each for each in range(2000000))    ##生成器
  23.     for i in nums:
  24.         if is_prime(i):
  25.             sum +=i
  26.     print(sum)

  27. if __name__ == '__main__':
  28.     main()
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-13 09:36:10 | 显示全部楼层
range函数本身就是生成器,何必多此一举?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 11:03:57 | 显示全部楼层
jerryxjr1220 发表于 2017-12-13 09:36
range函数本身就是生成器,何必多此一举?


谢谢这位大牛,初学者嘛,让您见笑了。您的意思是:
  1.     nums = (each for each in range(2000000))    ##生成器
  2.     for i in nums:
复制代码

与下面语句是等效率的吗?
  1.     nums =range(2000000)
  2.     for i in nums:
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-13 11:05:20 | 显示全部楼层
本帖最后由 payton24 于 2017-12-13 11:10 编辑
jerryxjr1220 发表于 2017-12-13 09:36
range函数本身就是生成器,何必多此一举?


另外,我用简单程序测算了一下,使用生成器和一般的for循环的运行时间都是差不多的。能指点一下吗?
代码一如下:
  1. import time
  2. import sys

  3. time_start = time.time()

  4. '''------------------------------------------------------------'''   
  5. import math
  6. def is_prime(number):
  7.     if number > 1:
  8.         if number == 2:
  9.             return True
  10.         if number % 2 == 0:
  11.             return False
  12.         for current in range(3, int(math.sqrt(number) + 1), 2):
  13.             if number % current == 0:
  14.                 return False
  15.         return True
  16.     return False
  17.    
  18. def main():
  19.     sum=0
  20. ##    nums = (each for each in range(2000000))
  21.     nums =range(2000000)
  22.     for i in nums:
  23.         if is_prime(i):
  24.             sum +=i
  25.     print(sum)

  26. main()
  27. '''------------------------------------------------------------'''

  28. time_end = time.time()
  29. print('返回结果花费的时间: %s' % (time_end - time_start))
  30. print('返回结果占用内存大小:%s' % sys.getsizeof(main()))
复制代码


IDLE结果为:
======================== RESTART: F:\Python-Ex\aa.py ========================
142913828922
返回结果花费的时间: 9.932051420211792
142913828922
返回结果占用内存大小:16
>>>

代码二如下:
  1. import time
  2. import sys

  3. time_start = time.time()

  4. '''------------------------------------------------------------'''
  5. import math
  6. def is_prime(number):
  7. ##    print('num %d' %number)
  8.     if number > 1:
  9.         if number == 2:
  10.             return True
  11.         if number % 2 == 0:
  12.             return False
  13.         for current in range(3, int(math.sqrt(number) + 1), 2):
  14.             if number % current == 0:
  15.                 return False
  16.         return True
  17.     return False

  18. def get_primes(number):
  19.     while True:
  20.         if is_prime(number):
  21.             yield number
  22.         number +=1
  23.    
  24. def solve():
  25.     sum=2
  26.     for next_prime in get_primes(3):
  27.         if next_prime < 2000000:
  28.             sum +=next_prime
  29.         else:
  30.             print(sum)
  31.             return

  32. if __name__ == '__main__':
  33.     solve()
  34. '''------------------------------------------------------------'''

  35. time_end = time.time()
  36. print('返回结果花费的时间: %s' % (time_end - time_start))
  37. print('返回结果占用内存大小:%s' % sys.getsizeof(solve()))
复制代码


IDLE结果为:
======================== RESTART: F:\Python-Ex\aa.py ========================
142913828922
返回结果花费的时间: 9.714050531387329
142913828922
返回结果占用内存大小:16
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-13 15:05:53 | 显示全部楼层
payton24 发表于 2017-12-13 11:05
另外,我用简单程序测算了一下,使用生成器和一般的for循环的运行时间都是差不多的。能指点一下吗?
...

你真的想了解range的底层逻辑的话,可以去看range的底层代码,看是如何实现的。
如果你只是初学者,可以先不必深究这个问题,只要知道range函数本身也是调用生成器产生的,所以不必要用生成器再产生生成器。生成器与生成器在代码逻辑相同的情况下,运行效率的差别是很小的。

评分

参与人数 1鱼币 +1 收起 理由
payton24 + 1 (* ̄︶ ̄)

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-12-13 17:39:00 | 显示全部楼层
jerryxjr1220 发表于 2017-12-13 15:05
你真的想了解range的底层逻辑的话,可以去看range的底层代码,看是如何实现的。
如果你只是初学者,可以 ...

多些指点,明白了。希望以后能看得懂底层逻辑,现阶段先记着。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表