【发布时间】:2014-12-13 07:32:35
【问题描述】:
所以我需要找到一种有效的方法来遍历 python 中的大列表。
给定:整数数组和数字(子列表的长度)
约束:数组最多 100K 个元素,元素在 range(1,2**31)
任务:为每个子列表找出最大和最小数量之间的差异。打印出最大的不同。
Ex: [4,6,3,4,8,1,9], number = 3
As far as I understand I have to go through every sublist:
[4,6,3] max - min = 6 - 3 = 3
[6,3,4] 3
[3,4,8] 5
[4,8,1] 7
[8,1,9] 8
final max = 8
所以我的解决方案是:
import time
def difference(arr, number):
maxDiff = 0
i = 0
while i+number != len(arr)+1:
diff = max(arr[i:i+number]) - min(arr[i:i+number])
if diff > maxDiff:
maxDiff = diff
i += 1
print maxDiff
length = 2**31
arr = random.sample(xrange(length),100000) #array wasn't given. My sample
t0 = time.clock()
difference(arr,3)
print 'It took :',time.clock() - t0
答案:
2147101251
It took : 5.174262
我也对 for 循环做了同样的事情,这会导致更糟糕的时间:
def difference(arr,d):
maxDiff = 0
if len(arr) == 0:
maxDiff = 0
elif len(arr) == 1:
maxDiff = arr[0]
else:
i = 0
while i + d != len(arr)+1:
array = []
for j in xrange(d):
array.append(arr[i + j])
diff = max(array) - min(array)
if diff > maxDiff:
maxDiff = diff
i += 1
print maxDiff
length = 2**31
arr = random.sample(xrange(length),100000) #array wasn't given. My sample
t0 = time.clock()
difference(arr,1000)
print 'It took :',time.clock() - t0
答案:
2147331163
It took : 14.104639
我的挑战是将时间减少到 2 秒。
最有效的方法是什么???
根据@rchang 和@gknicker 的回答和评论,我得到了改进。我想知道我还有什么可以做的吗?
def difference(arr,d):
window = arr[:d]
arrayLength = len(arr)
maxArrayDiff = max(arr) - min(arr)
maxDiff = 0
while d < arrayLength:
localMax = max(window)
if localMax > maxDiff:
diff = localMax - min(window)
if diff == maxArrayDiff:
return diff
break
elif diff > maxDiff:
maxDiff = diff
window.pop(0)
window.append(arr[d])
d += 1
return maxDiff
#arr = [3,4,6,15,7,2,14,8,1,6,1,2,3,10,1]
length = 2**31
arr = random.sample(xrange(length),100000)
t0 = time.clock()
print difference(arr,1000)
print 'It took :',time.clock() - t0
答案:
2147274599
It took : 2.54171
还不错。还有其他建议吗?
【问题讨论】:
-
两个快捷优化建议:1) 如果 max()
-
也许您应该考虑使用
numpy,这是一个专门用于处理(大)数值数据的模块。它通常比纯 python 快很多。 -
关于
numpy@Peter 的观点非常好。我还没有能够得到一个numpy实现来超越我发布的答案——这个数据体可能不够大,无法获得好处。或者可能会有一些关于我如何使用numpy来做这件事的事情。如果我有空闲时间,我会在今天晚些时候探索。
标签: python-2.7