免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: forceps
打印 上一主题 下一主题

太郁闷了,python求质数怎么比VBA还慢!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-04-12 11:29 |只看该作者
原帖由 gawk 于 2009-4-12 11:06 发表
楼主,要不你写一个2个都不文件的也不写到单元格的比较一下,看看时间差距是多少


改了,不写文件也不写单元格,还是Cygwin python vs Excel vba

Cygwin python: 19.3s
Excel vba: 5.5s
19.3s / 5.5s = 3.5

论坛徽章:
0
12 [报告]
发表于 2009-04-12 11:51 |只看该作者
的确是慢,我也试了一下

论坛徽章:
0
13 [报告]
发表于 2009-04-12 12:29 |只看该作者
有意思啊,太有意思了
怎么都在讨论python的速度啊
看来python真的火了

附:
一个简单的排序程序 c++的居然没有python 很郁闷 这是为什么呢
https://groups.google.com/group/pongba/browse_thread/thread/840dd3bba4ce2762/9f8ba8fc9ff12f63#

ps:搞不懂,为什么要用Cygwin python,不是有原装的msc编译的吗

[ 本帖最后由 yaksavage 于 2009-4-12 12:32 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-04-12 12:51 |只看该作者
楼主,你的python代码中为什么要x-=1 y+=1?

论坛徽章:
0
15 [报告]
发表于 2009-04-12 13:24 |只看该作者
楼主你把range换成xrange试试
我测了一下快好多了

论坛徽章:
0
16 [报告]
发表于 2009-04-12 13:34 |只看该作者
楼主,你还需要调用个模块
import psyco
psyco.full()

加上这段绝对快!

论坛徽章:
0
17 [报告]
发表于 2009-04-12 13:34 |只看该作者

  1. import time
  2. y=3
  3. start=time.time()
  4. myfile=open('primes.txt','w')
  5. for y in xrange(3,500001):
  6.     i = int(y**0.5)+1
  7.     for x in xrange(2,i):
  8.         if y%x == 0 : break
  9.     else:
  10.         print >> myfile,y
  11. myfile.close()
  12. end=time.time()
  13. print "End!\nUse Time:%f s" % (end-start)
复制代码

论坛徽章:
0
18 [报告]
发表于 2009-04-12 13:45 |只看该作者
原帖由 gawk 于 2009-4-12 12:51 发表
楼主,你的python代码中为什么要x-=1 y+=1?

对啊。
先前是用while x>1, 这样x-=1递减x,改成for x in range[]就不用了。我是新手,多谢!

另外回13楼,其实我折腾的对象主要是debian,对我这样蜻蜓点水,今天弄弄gcc,明天试试python,偶尔还要试试新东西,比如有兄弟提到的psyco模块,用debian可能更方便一些。办公机器,只能模拟一下linux,我用coLinux装的Debian Lenny,但coLinux还是要稍许慢一些。同样求质数要多花至少1.5倍的时间。听说cygwin速度已经很接近windows下直接执行的速度了,而相比用windows下的python,用cygwin又和Debian更接近一点。我懒得重新适应 windows下的python,所以和vba比较速度的时候就用相对coLinux更快一点的cygwin python计时。我也是瞎折腾,和诸位大虾靠python吃饭不一样。

[ 本帖最后由 forceps 于 2009-4-12 14:21 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-04-12 13:58 |只看该作者
原帖由 gawk 于 2009-4-12 13:34 发表

import time
y=3
start=time.time()
myfile=open('primes.txt','w')
for y in xrange(3,500001):
    i = int(y**0.5)+1
    for x in xrange(2,i):
        if y%x == 0 : break
    else:
        ...



果真又快了,现在求50万以下的质数耗时9.58s,换用xrange()快了一倍。但还是比vba慢。9.58s/5.5s = 1.74。

下一步试试psyco。

论坛徽章:
0
20 [报告]
发表于 2009-04-12 14:36 |只看该作者
用筛选法求质数,1000000以内的用了0.765s.

import time
start_time=time.time()

myfile=open('primes.txt','w')
NUM =1000000
prime_num = [i for i in xrange(NUM+1)]
for i in xrange(2,int(NUM**0.5)+1):
  if prime_num[i]:
      start = i**2
      step  = i
      prime_num[start::step] = ((NUM - start)/step + 1)*[0]
print >> myfile,[i for i in prime_num if prime_num[i]!=0]
myfile.close()

end_time=time.time()
print "End!\nUse Time:%f s" % (end_time-start_time)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP