我需要以下代码才能在没有线程或多处理的情况下更快地完成。如果有人知道任何技巧会非常感激。也许for i in enumerate()
或者在计算之前将列表更改为字符串,我不确定
对于下面的例子,我试图使用随机序列重新创建变量,但是这已经使循环中的一些条件变得无用......这对于这个例子来说是好的,它只是意味着代码的'true'应用程序需要稍长时间。
目前在我的i7上,下面的示例(主要是绕过它的一些条件)在1秒内完成,我希望尽可能地降低它。
import random
import time
import collections
import cProfile
def random_string(length=7):
"""Return a random string of given length"""
return "".join([chr(random.randint(65, 90)) for i in range(length)])
LIST_LEN = 18400
original = [[random_string() for i in range(LIST_LEN)] for j in range(6)]
LIST_LEN = 5
SufxList = [random_string() for i in range(LIST_LEN)]
LIST_LEN = 28
TerminateHook = [random_string() for i in range(LIST_LEN)]
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Exclude above from benchmark
ListVar = original[:]
for b in range(len(ListVar)):
for c in range(len(ListVar[b])):
#If its an int ... remove
try:
int(ListVar[b][c].replace(' ', ''))
ListVar[b][c] = ''
except: pass
#if any second sufxList delete
for d in range(len(SufxList)):
if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = ''
for d in range(len(TerminateHook)):
if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = ''
#remove all '' from list
while '' in ListVar[b]: ListVar[b].remove('')
print(ListVar[b])
答案 0 :(得分:3)
ListVar = original[:]
这是ListVar的浅表副本,因此您对第二级列表的更改也会影响原始列表。你确定这是你想要的吗?更好的方法是从头开始构建新的修改后的列表。
for b in range(len(ListVar)):
for c in range(len(ListVar[b])):
Yuck:只要有可能就直接在列表上进行迭代。
#If its an int ... remove
try:
int(ListVar[b][c].replace(' ', ''))
ListVar[b][c] = ''
except: pass
你想忽略数字中间的空格?这听起来不对。如果数字可能为负数,则可能需要使用try..except
,但如果它们只是正数,则只需使用.isdigit()
。
#if any second sufxList delete
for d in range(len(SufxList)):
if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = ''
这只是错误的命名吗? SufxList意味着你正在寻找后缀,如果是这样,只需使用.endswith()
(并注意你可以传入一个元组来避免循环)。如果你确实想要在字符串中的任何地方找到后缀,请使用in
运算符。
for d in range(len(TerminateHook)):
if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = ''
再次使用in
运算符。此处any()
也很有用。
#remove all '' from list
while '' in ListVar[b]: ListVar[b].remove('')
并且while
是O(n ^ 2),即它会很慢。您可以使用列表推导来消除空白,但最好只是为了开始构建干净的列表。
print(ListVar[b])
我想也许你的缩进在那张照片上是错误的。
将这些建议放在一起会产生类似的结果:
suffixes = tuple(SufxList)
newListVar = []
for row in original:
newRow = []
newListVar.append(newRow)
for value in row:
if (not value.isdigit() and
not value.endswith(suffixes) and
not any(th in value for th in TerminateHook)):
newRow.append(value)
print(newRow)