免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 26280 | 回复: 51
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-12 07:02 |只看该作者 |倒序浏览
在我的机器上求40000以下的所有质数, python要61秒,Excel vba只要4秒多。

-------------------- python代码 --------------------
#!/usr/bin/env python
y=3
myfile=open('primes.txt','w')
while y<40000:
    x=y/2
    while x>1:
        if y%x==0:break
        x-=1
    else:
        print >>myfile,y,'\n'
    y+=1
myfile.close()
print 'End'
-------------------- End Python --------------------



-------------------- Excel VBA --------------------
Sub find_primer()
        Dim Arry1D_Primer(1 To 30000, 0 To 1)
        Dim y As Long, x As Long, m As Long, n As Long
        Dim i As Integer, k As Integer
        k = 0
        m = 1
        For y = 3 To 40000
                i = Int(y / 2)
                For x = i To 2 Step -1
                        If (y Mod x) = 0 Then
                                k = 1
                                Exit For
                        End If
                Next x
                If k = 0 Then
                        Arry1D_Primer(m, 0) = y
                        m = m + 1
                End If
                k = 0
        Next y
        Range("a1:b30000").Value = Arry1D_Primer
End Sub
-------------------- End VBA --------------------

论坛徽章:
0
2 [报告]
发表于 2009-04-12 07:22 |只看该作者
#!/usr/bin/env python
y=3
myfile=open('primes.txt','w')
while y<40000:
    x=2
    while x<y**0.5:
        if y%x==0:break
        x+=1
    else:
        print >>myfile,y,
    y+=1
myfile.close()
print 'End'


Python代码这样写就快多了,1秒就够了

论坛徽章:
0
3 [报告]
发表于 2009-04-12 07:45 |只看该作者
确实快了许多。但更郁闷的事情在后头,我按你的python代码改写了vba,现在vba只要0.235秒。还是比python快很多。


Sub find_prime()
    Dim Arry1D_prime(1 To 30000, 0 To 1)
    Dim y As Long, x As Long, m As Long, n As Long
    Dim i As Integer, k As Integer
    k = 0
    m = 1
    For y = 3 To 40000
        i = Int(Sqr(y))
        For x = i To 2 Step -1
            If (y Mod x) = 0 Then
                k = 1
                Exit For
            End If
        Next x
        If k = 0 Then
            Arry1D_prime(m, 0) = y
            m = m + 1
        End If
        k = 0
    Next y
    Range("a1:b30000").Value = Arry1D_prime
End Sub


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

论坛徽章:
0
4 [报告]
发表于 2009-04-12 09:17 |只看该作者
运行这段代码差不多0.35S左右。Python和VBA都是解释执行的,Python的优势并非执行效率而是开发效率。如果需要很高效率的话直接用C写扩展就行了。

import time
y=3
start=time.time()
myfile=open('primes.txt','w')
while y<40000:
    x=2
    limit=y**0.5
    while x<=limit:
        if y%x==0:break
        x+=1
    else:
        print >>myfile,y,
    y+=2
myfile.close()
end=time.time()
print "End!\nUse Time:%f s" % (end-start)

论坛徽章:
0
5 [报告]
发表于 2009-04-12 10:08 |只看该作者
很有道理。只是太不甘心了。
另外,你是什么机器,真快!我是1.8G的Intel Core 2 duo, 运行cygwin下的python,你上面的python在我的机器上运行时间是1.67s, 是vba(0.23s)的7.2倍。继续改:
#!/usr/bin/env python
myfile=open('primes.txt','w')
for y in range(3,500001):
    i = int(y**0.5)+1
    for x in range(2,i):
        if y%x == 0 : break
        x -= 1
    else:
        print >> myfile,y
    y += 1
myfile.close()


这一次算到50万以下,耗时19.4s,是Excel vba(5.7s)的3.4倍。

论坛徽章:
0
6 [报告]
发表于 2009-04-12 10:21 |只看该作者
你应该在Linux下面,用native的Python和Wine下面的Excel的VBA比较。这样比较公平。

论坛徽章:
0
7 [报告]
发表于 2009-04-12 10:31 |只看该作者

回复 #5 forceps 的帖子

机子配置差不多吧,也可能是你电脑运行太多程序的缘故,我是windows下Python直接运行的。

论坛徽章:
0
8 [报告]
发表于 2009-04-12 10:33 |只看该作者
楼主你python有往文件里写入的,vba好像没有,不熟vba,你看看是不是这个原因

论坛徽章:
0
9 [报告]
发表于 2009-04-12 10:42 |只看该作者
文件没存盘,但是写到单元格里了。见附件。

findPrime.zip

9.27 KB, 下载次数: 68

findPrime.xls

论坛徽章:
0
10 [报告]
发表于 2009-04-12 11:06 |只看该作者
楼主,要不你写一个2个都不文件的也不写到单元格的比较一下,看看时间差距是多少
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP