V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Bill1
V2EX  ›  Python

Python 写的计算质数的程序,怎样才可以提高运算效率?

  •  
  •   Bill1 · 2017-01-05 14:49:19 +08:00 · 2503 次点击
    这是一个创建于 2871 天前的主题,其中的信息可能已经有所发展或是发生改变。

    程序代码如下:

    import os
    primenumber=2
    testnumber=primenumber
    
    while True:
    	while True:
    		testnumber=testnumber-1
    		if testnumber==1:
    			print(primenumber)
    			primenumberwrite=str(primenumber)
    			f=open("PrimeNumber.txt",'a')
    			f.write(primenumberwrite)
    			f.write('\n')
    			f.close()
    			break
    		elif primenumber%testnumber==0:
    			break
    	primenumber=primenumber+1
    	testnumber=primenumber
    
    第 1 条附言  ·  2017-01-05 16:05:28 +08:00
    根据 @GoForce5500 的提示,运算程序更新。
    代码如下:
    ```
    import os
    primenumber=2
    testnumber=2

    while True:
    while True:
    if testnumber==primenumber:
    print(primenumber)
    primenumberwrite=str(primenumber)
    f=open("PrimeNumber.txt",'a')
    f.write(primenumberwrite)
    f.write('\n')
    f.close()
    break
    elif primenumber%testnumber==0:
    break
    testnumber=testnumber+1
    primenumber=primenumber+1
    testnumber=2

    ```
    (附言不支持 MD ,脑补缩进符)
    第 2 条附言  ·  2017-01-06 11:19:48 +08:00

    可以用MD

    代码如下:

    import os
    primenumber=2
    testnumber=2
    
    while True:
    	while True:
    		if testnumber==primenumber:
    			print(primenumber)
    			primenumberwrite=str(primenumber)
    			f=open("PrimeNumber.txt",'a')
    			f.write(primenumberwrite)
    			f.write('\n')
    			f.close()
    			break
    		elif primenumber%testnumber==0:
    			break
    		testnumber=testnumber+1
    	primenumber=primenumber+1
    	testnumber=2
    
    13 条回复    2017-01-06 02:58:26 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2017-01-05 15:09:00 +08:00 via iPhone   ❤️ 1
    这种没啥复杂度的程序用 c 写,然后 python 调用就行了
    iEverX
        2
    iEverX  
       2017-01-05 15:14:20 +08:00
    打表
    a87150
        3
    a87150  
       2017-01-05 15:17:59 +08:00 via Android
    换成 c ,可以快几十倍。
    Fulminit
        4
    Fulminit  
       2017-01-05 15:20:26 +08:00 via iPhone
    换个算法
    ty89
        5
    ty89  
       2017-01-05 15:22:05 +08:00
    你的文件操作不要写在循环的最内层。
    可以先放在内存里,累计到一定量之后往文件里写一次
    cxbats
        6
    cxbats  
       2017-01-05 15:23:10 +08:00
    打开文件挪到循环外面去
    est
        7
    est  
       2017-01-05 15:31:37 +08:00
    这种就不要自己算了。打表。
    GoForce5500
        8
    GoForce5500  
       2017-01-05 15:35:25 +08:00
    这代码有太多值得优化的地方。
    优先检查小数而不是大数,小数是更多数的因数,例如被测数为 1000000000 不需要从 999999999 测试到 500000000 ,能被 2 整除然后直接就返回了,立省 500000000 次运算。
    尽量减小测试数据范围,测试质数时只需要测试是不是能够被 2~待测数的开方整除就行,比如测试 36 只需要测到 6 即可,一下快 6 倍……
    检查最后一位是不是 0 、 2 、 4 、 5 、 6 、 8(需要大于 2),这些数不可能为质数,又能省一部分运算。
    Coursera 上普林斯顿大学 Algorithm 的主讲教授 Robert Sedgewick 的课程能帮助你。用他的原话来说就是除非你的算法和数据结构都已经高度优化否则不要依赖超级计算机,好的数据结构和算法才能够真正解决问题。
    Bill1
        9
    Bill1  
    OP
       2017-01-05 15:42:49 +08:00
    lonelinsky
        10
    lonelinsky  
       2017-01-05 15:44:59 +08:00
    楼主可以百度一下 线性筛法 , 其实打表更好
    loryyang
        11
    loryyang  
       2017-01-05 15:49:34 +08:00
    loryyang
        12
    loryyang  
       2017-01-05 15:51:02 +08:00
    这种问题前人已经深入研究了很多年,站在前人的肩膀上,不要闭门造车
    msg7086
        13
    msg7086  
       2017-01-06 02:58:26 +08:00
    1. 质数算法已经很成熟了,如果只是要提升速度的话不如换个算法。
    2. 回复可以用 MD ,右下角有选择框可以选 MD 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1890 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.