【发布时间】:2015-02-16 20:27:35
【问题描述】:
如果有这样的整数列表:
a_list = [2501, 2783, 3088, 3980, 465, 1001, 39392911, 39394382, 488955,489087, ......]
b_list = [474, 498, 47478821, 47479800, 3774, 8970, 484000, 486000......]
每2个数字表示一个自然数的范围,例如,a_list的范围是:
2501 2783 # 2501,2502,2503,2504,2505,2506,......,2783
3088 3980
465 1001
39392911 39394382
488955 489087
......
对于给定的数字,搜索它所属的范围,并且优先级为a_list > b_list,即如果在a_list中找到范围,则停止搜索并继续搜索下一个数字。
我进行了大约 7 分钟的搜索约 50 个号码的测试。我有一个大数据集,可能需要以他的方式搜索 2000 万个数字。
如何编写代码以加快速度?
=============更多条件和信息=============
- 每个列表中的数字可能超过 10,000 个。
- 最多可搜索 3000 万个号码。
- 列表的大小始终为 n * 2
- a_list: [1st
- 列表中的数字可能出现多次。
- 优先级:a_list > b_list。
我的代码如下:
hasFound = 0
if hasFound == 0:
for x, y in izip(*[iter(a_list)]*2): # gives every 2 numbers
if aNumber in range(x,y):
a_list_counter +=1
hasFound = 1
break
if hasFound == 0:
for x, y in izip(*[iter(b_list)]*2):
if aNumber in range(x,y):
b_list_counter += 1
hasFound = 1
break
提前非常感谢。
【问题讨论】:
-
您使用的是蛮力方法。有一个更优雅的方法你没有想到。
-
if aNumber in range(x,y)应该只是x <= aNumber <= y -
@Nsh 值得注意的是,这样做的原因是 Python 2.x 中的
range(x, y)实际上构建了一个所有数字的列表,这需要时间和内存。在 Python 3.x 中,range()返回一个可以高效执行此类操作的特殊对象。 -
@Almo,你说得对,我想做得更好,但没能成功。
-
我可能错了,但我的直觉告诉你,你想先对列表进行处理,然后将它们减少到尽可能小的范围集。就像 (1, 5) (3, 6) 会来 (1, 6)。