- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我需要找到一种有效的方法来迭代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
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
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
最佳答案
这是我解决这个问题的尝试。
我进行了大量的实验和测量,得出以下结论:
subset_length
对性能有显着影响。 numpy
min/max 比内置函数快得多,但仅适用于大型数组,例如 50 以下,内置函数更快。 array
必须是
numpy.array()
并且
subset_length
必须是 3 或更多。
def difference_np(array, subset_length):
assert subset_length > 2, "subset_length must be larger than 2"
length = array.size
total_diff = array.max()-array.min()
current_min = array[:subset_length].min()
current_max = array[:subset_length].max()
max_diff = current_max - current_min
max_diff_index = 0
index = subset_length
while index < length:
i_new = index
i_old = index-number
index += 1
new = array[i_new]
old = array[i_old]
# the idea here is to avoid calculating the
# min/max over the entire subset as much as possible,
# so we treat every edge case separately.
if new < current_min:
current_min = new
if old == current_max:
current_max = array[i_old+1:i_new-1].max()
elif new > current_max:
current_max = new
if old == current_min:
current_min = array[i_old+1:i_new-1].min()
elif old == current_min:
current_min = array[i_old+1:i_new].min()
elif old == current_max:
current_max = array[i_old+1:i_new].max()
else:
continue
current_diff = current_max-current_min
if current_diff > max_diff:
max_diff = current_diff
max_diff_index = i_old
# shortcut-condition
if max_diff == total_diff:
print('shortcut at', (index-1)/(length-subset_length), '%' )
break
return max_diff, max_diff_index
list.pop(0)
,则存在另一个改进余地。由于
list
针对右侧操作进行了优化,因此
list.pop(0)
相对昂贵。使用
collections.deque
时,存在一种提供快速左侧弹出的替代方法:
deque.popleft()
。为整体速度带来了不小的提升。
numpy
collections.deque
版本:
def difference_deque(array, subset_length):
assert subset_length > 1, "subset_length must be larger than 1"
length = len(array)
total_diff = max(array)-min(array)
current_slice = collections.deque(array[:subset_length])
current_min = min(current_slice)
current_max = max(current_slice)
max_diff = current_max - current_min
max_diff_index = 0
index = subset_length
while index < length:
i_new = index
i_old = index-number
index += 1
new = array[i_new]
old = current_slice.popleft()
if new < current_min:
current_min = new
if old == current_max:
current_max = max(current_slice)
current_slice.append(new)
elif new > current_max:
current_max = new
if old == current_min:
current_min = min(current_slice)
current_slice.append(new)
elif old == current_min:
current_slice.append(new)
current_min = min(current_slice)
elif old == current_max:
current_slice.append(new)
current_max = max(current_slice)
else:
current_slice.append(new)
continue
current_diff = current_max-current_min
if current_diff > max_diff:
max_diff = current_diff
max_diff_index = i_old+1
# shortcut-condition
if max_diff == total_diff:
print('shortcut at', (index-1)/(length-number), '%' )
break
return max_diff, max_diff_index
关于python-2.7 - 在python中迭代巨大列表的子列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27456618/
我通过在共享首选项中使用 GSON 将其转换为 json 来存储我的复杂对象。但是在检索它时,无法获得预期的字符串。 代码 这里 holderListCustomizationMap 是对象的复杂映射
因此,我正在尝试对大于可用RAM的gz压缩文件执行某种面向行的操作,因此排除了将其首先读取为字符串的情况。问题是,如何在rust(缺少gunzip file.gz|./my-rust-program)
我试图更好地理解为什么具有潜在大精度的大数字处理不一致,特别是在 JavaScript 及其本地化工具(例如 ECMA-402/Intl)中。我假设这与 float 的使用有关,但我想了解限制在哪里和
我们有一个 5GB 的 csv 文件,这是我们业务的主列表。 有多个类别,每个类别包含数千条记录。我们的目标是将每个类别导出为其自己的 csv 文件。 我们如何运行查询并导出数据? 运行 OSX。有没
基于上一个问题 ( see here ),我试图通过 xmlEventParse 读取许多大型 xml 文件,同时保存节点变化数据。使用此示例 xml:https://www.nlm.nih.gov/
我正在开发一个系统,它加载一个巨大的 CSV 文件(超过 100 万行)并保存到数据库中。每行也有超过一千个字段。 CSV 文件被视为一个批处理,每一行都被视为其子对象。在添加对象的过程中,每个对象都
借助node-google模块 我编写了一个简单的 Node 模块来为我的网络应用程序启用“文本网络搜索”功能,并在我的一个 View 中显示结果。 由于在来自同一 IP 的少量查询后 Google
我有相当大的 4D 阵列 [20x20x40x15000],我使用 h5py 将其作为 HDF5 文件保存到磁盘.现在的问题是我想计算整个数组的平均值,即使用: numpy.average(HDF5_
我在遗留代码库中连接巨大的 CString 时遇到问题。 CStrings 可以包含 base64 编码的文件,因此可能很大。在某些时候,这些 CString 会像这样连接起来: result +=
我正在尝试让我的服务器提供来自另一台服务器的巨大文件。但是,为了保护我的凭据免受该远程服务器的攻击,我不能简单地将请求者重定向到文件 url;另一方面,虽然使用 StreamingHttpRespon
感谢对此的任何见解,我有 2 个问题: 1) 弄清楚为什么我的本地数据库 oplog 庞大且不断增长 2) 安全删除(或重置)我的 local.oplog 以释放 18 GB 的浪费空间 场景:我一直
我的预期任务:获取大量数据(1 GB 及更多大小)json 字符串,操作(进行一些格式化、解析 json、重组 json 数据)并写入新格式化的 json 字符串作为响应。处理这种情况的更好方法是什么
我做了一个小的 Angular 4 应用程序,但我不知道如何应用 tree shaking 和 aot 编译。我运行的命令如下: ng build --prod --aot 但我得到的结果仍然很大,供
我是一名优秀的程序员,十分优秀!