【发布时间】:2021-07-25 11:49:15
【问题描述】:
我对编码很陌生,目前正在努力研究如何针对更大的列表优化此代码。
import pandas as pd
import random
from time import time
rows = []
list1 = [random.randint(1, 100) for i in range(1_000_000)]
list2 = [random.randint(1, 100) for i in range(1_000_000)]
list3 = [random.randint(1, 100) for i in range(1_000_000)]
list4 = [random.randint(1, 100) for i in range(1_000_000)]
start = time()
for i in range(len(list1) - 1):
if list1[i] < list2[i] and list1[i + 1] > list2[i + 1]:
dict1 = {1: list1[i], 2: '+'}
rows.append(dict1)
elif list1[i] > list2[i] and list1[i + 1] < list2[i + 1]:
dict1 = {1: list1[i], 2: '-'}
rows.append(dict1)
if list3[i] < list4[i] and list3[i + 1] > list4[i + 1]:
dict1 = {1: list3[i], 2: '+'}
rows.append(dict1)
elif list3[i] > list4[i] and list3[i + 1] < list4[i + 1]:
dict1 = {1: list3[i], 2: '-'}
rows.append(dict1)
else:
dict1 = {1: list3[i], 2: '#'}
rows.append(dict1)
end = time()
print(end - start)
df = pd.DataFrame(rows)
10_000_000 个条目大约需要 30 秒。它线性增长。 有没有办法针对更大的数字对其进行优化?
我觉得 for 循环和 if-else 语句是最耗时的语句,但我想不出优化它们的方法。
【问题讨论】:
-
它不会呈指数级增长,而是会呈线性增长。是 O(N)。你到底想在这里完成什么?
-
顺便说一句,您的第一个语句有错字:最后一个
list1应该是list2。这里的整个概念是有缺陷的。如果list1[i] < list2[i],则按定义list1[i]+1 < list2[i] + 1。我不认为这是你打算做的。 -
您在寻找这两个系列的交叉点吗?我假设您的意思是
if list1[i] < list2[i] and list1[i+1] > list2[i+1]。如果是这样,这样做的方法是使用numpy,将两个列表相减,然后查找与np.where(np.diff(np.sign(x)))的零交叉。 -
对于错误,我很抱歉,我现在修正了错别字。
-
好的,谢谢,我试试看。
标签: python-3.x list for-loop optimization large-data