加快此代码?

我正在创建一个程序来计算0范围内的所有总数 到n,n是用户想要的. 我已经解决了 算法,它运行得很好,而且很快,但是一件事 严重减慢程序的是以下代码: def rmlist(原始,删除): 返回[如果我不删除,则我是原始的] 原件将是奇数数字的列表,删除将为数字 不是素数,因此此代码将返回原始项目 不在删除中. 对于n> 100,000左右,该程序采用 运行时间很长,而最多可达10,000的数字是可以的. 有人知道这样做的更快的方法吗? (找到全部差异 列表A中不在列表b)中的项目? 谢谢, Martin

# 回答1

对于列表而言," In"操作员很昂贵,因为Python必须检查, 平均而言,列表中的一半. 使用更好的数据结构... 在这种情况下,一套会做得很好. 请参阅文档:http://docs.python.org/lib/types-set.html http://docs.python.org/tut/node7.htm...0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来 哦,您没有要求它,但我确定您会得到一打 来自其他C.L.Py'ers的Prime发电机的宠物实施. 所以 这是我的. :-) def primes(): """使用Eratosthenes的筛子生成质数. 产量2 标记= {} cur = 3 而真: skip = marks.pop(cur,无) 如果跳过没有: #未标记的数字必须是PRIME 产生cur #标记前方 标记[cur*cur] = 2*cur 别的: n = cur +跳过 而n在标记中: #x已经标记为另一个素数的倍数 n +=跳过 #这个素数的第一个未标记的倍数 标记[n] =跳过 cur += 2 -ben
# 回答2

> def rmlist(原始,删除): 在未分类列表中的会员资格测试是O(n) 操作...列表越大,所需的时间越长. 我认为订单无关紧要,或者可以对结果进行排序 事实之后. 如果是这种情况,使用效率很高 提供相交/差异/联合方法的集合. 如果你 通过集合而不是列表,您可以简单地 返回Original.Difference(删除) 几乎不值得致电函数:)还有一个 现场版本称为nower_update(). 找到所有想要的结果后,完成了所有集合 您想要的差异,您可以将结果集传递给 列出并对其进行排序,如果分类结果很重要. -tkc
# 回答3

但是您可能不想使用这种实现. 这是使用发电机的版本: def sieve_all(n = 100): #产生最多n的所有素数 stream = iter(xrange(2,n)) 而真: p = stream.next() 产量p DEF S1(P,流): #产生P的所有非元素 返回(如果q%p!= 0,则Q在流中的Q) 流= S1(P,流) #打印所有最多100的素数 打印列表(sieve_all(100)) 它很可爱,但是一旦您意识到它在做什么;-)
# 回答4

我使用差异()和集合,谢谢! 100,000次 大约3 时间是10,000的时间,这是我的数学伙伴告诉我的 我应该得到,而不是指数增长:). 谢谢, 全部!
# 回答5

- 使删除设置,在集合中的会员资格测试速度更快 而不是搜索大列表. - 找到更好的算法;) 肯特
# 回答6

如果您对此类程序感兴趣,可以看看这个程序 也是:http://aspn.activestate.com/aspn/coo.../recipe/366178 它需要更多的内存,但是很快. 再见, bearophile
# 回答7

bedeydebeyde theidge@lycos.com写道: 我将这个(a)的速度与保罗·鲁宾的速度进行了比较 以上(b). 1至100的素数 - A -0.000118 B -0.000007 1至200的素数 - A -0.000224 B -0.000008 1至300的素数 - A -0.000278 B -0.000008 好人,保罗. 弗兰克·米尔曼
# 回答8

#保罗·鲁宾的版本 gregory@home:〜$ python -mtimeit" intimpt test2"" test2.primes(1000)" 100循环,最佳3:14.3毫秒每循环 #菜谱中的版本 gregory@home:〜$ python -mtimeit" intimpt test1"" test1.primes(1000)" 1000循环,最佳3:528 USEC每循环
# 回答9

弗兰克·米尔曼(Frank Millman)在2006年5月26日晚上11:25写道:我将这一速度(a)的速度与保罗·鲁宾(Paul Rubin)的速度(b)进行了比较. 从1到100 -a -0.000118 b -0.000007素数从1到200 -a -0.000224 b -0.00024 b -0.000008素数从1到300- a -0.000278 b -0.000278 b -0.000008 NICE ONE,PAUL. 弗兰克·米尔曼 很好,弗兰克. 回去阅读保罗的代码. 阅读他在底部写的东西:"" 可爱,但一旦意识到它在做什么;-)""" 帕克斯·海森伯格(Pax Heisenberg),这是天生的可怕,观察者是否意识到 或不 :-)
# 回答10

我已经尝试了此比较,并通过我修改了一些版本,我 已经在sieve_all中解决了一个问题,例如n = 10000,i 不知道为什么: def sieve_all(n = 100): #产生最多n的所有素数 stream = iter(xrange(2,n)) 而真: p = stream.next() 产量p DEF S1(P,流): #产生P的所有非元素 返回(如果q%p!= 0,则Q在流中的Q) 流= S1(P,流) def primes(n): "素数(n):返回质数<= n的列表." #食谱366178修改并修复 如果n == 2: 返回[2] Elif n <2: 返回 [] s =范围(3,n+2,2) mroot = n ** 0.5 半= len(s) i = 0 M = 3 而m <= mroot: 如果s [i]: j =(m*m -3) / 2 s [j] = 0 而j n: S [-1] = 0 返回[2] +过滤器(无,S) 从时间导入时钟 pmax = 21 对于Xrange(12,pmax)中的p: n = 2 ** p t1 = clock() 素数(n) t2 = clock() 列表(sieve_all(n)) t3 = clock() 打印" Primes(2^%s =%s):"%(p,n),圆形(T2-T1,3)," S", 圆形(T3-T2,3)," S" 导入Psyco psyco.bind(primes) psyco.bind(sieve_all) 对于Xrange(12,pmax)中的p: n = 2 ** p t1 = clock() 素数(n) t2 = clock() 列表(sieve_all(n)) t3 = clock() 打印" Primes(2^%s =%s):"%(p,n),圆形(T2-T1,3)," S", 圆形(T3-T2,3)," S" 再见, 熊
# 回答11

在2006年5月27日上午6:57,BE ****** ******@lycos.com写道: 更好地利用带宽来提供详细信息 问题而不是所有无关的源代码. 您是否明白了:"" RuntimeError:最大递归深度超过""? 你不知道为什么?
# 回答12

格雷戈里·彼得罗斯(Gregory Petrosyan)写道: 您是对的,Gregory,我的时间已经过去了. 我已经弄清楚了我的错误. 保罗的功能是发电机. 与A不同 正常功能,调用发电机函数时,它不会 实际运行整个函数,它只会返回生成器对象. 它只有在迭代它直到耗尽时才能运行. 我曾是 有效测量 *创建 *发电机所需的时间,而不是 迭代它. 感谢您纠正我. 弗兰克
# 回答13

你好马丁, 您可以使用gmpy(http://gmpy.sourceforge.net/) def primes(): n = 2 而1: 产生长(n) n = gmpy.next_prime(n) hth, miki http://pythonwise.blogspot.com/

标签: python

添加新评论