[英]Index/Offset performance is terrible - what am I doing wrong? Python
我需要從xml字段中組裝一個長文本字符串。
XML_FIELD_ONE =“ Iamacatthatisoddlyimmunetocatnip”
XML_FILED_TWO = [7,8,24]
FILED_TWO包含要在其中插入\\ n或\\ r的索引。 如果兩個索引相隔1(例如7、8),那么我需要插入\\ r \\ n。 如果索引是單獨的(例如24),則需要插入\\ n。
使用此代碼處理25K行文件大約需要2分鍾。 我究竟做錯了什么?
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FILED_TWO = [7,8,24]
idx = 0
while idx <= len(XML_FIELD_ONE):
for position in XML_FIELD_ONE:
for space in XML_FIELD_TWO:
if idx == int(space) and idx+1 == int(space)+1:
XML_FIELD_ONE[idx] = "\r"
try:
XML_FIELD_ONE[idx+1] = "\n"
except:
pass
elif idx == int(space):
XML_FIELD_ONE[idx] = "\n"
idx += 1
new_text = "".join(XML_FIELD_ONE)
return new_text
這樣做的簡單方法是:
for offset in XML_FILED_TWO:
XML_FILED_ONE[offset] = \n
但這違反了“如果兩個偏移量在一起,則第一個是\\ r,下一個是\\ n”
您只需要一個循環時就編寫了一個三重循環。 這是非常低效的。 您確切知道要在哪里插入新項目:直接去那里,而不是增加兩個計數器來找到位置。
我不確定您需要插入的確切位置,但這應該很近。 為了保持原始索引正確,您需要從右端插入並向左移動; 這就是為什么我反轉XML_FIELD_TWO。
我離開了調試打印語句。
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FIELD_TWO = [7,8,24]
print XML_FIELD_ONE
XML_FIELD_TWO = XML_FIELD_TWO[::-1]
print XML_FIELD_TWO
i = 0
while i < len(XML_FIELD_TWO):
print i, XML_FIELD_TWO[i]
if XML_FIELD_TWO[i] - XML_FIELD_TWO[i+1] == 1:
XML_FIELD_ONE.insert(XML_FIELD_TWO[i], '\r\n')
i += 2
else:
XML_FIELD_ONE.insert(XML_FIELD_TWO[i], '\n')
i += 1
print "\n", ''.join(XML_FIELD_ONE)
輸出:
['I', 'a', 'm', 'a', 'c', 'a', 't', 't', 'h', 'a', 't', 'i', 's', 'o', 'd', 'd', 'l', 'y', 'i', 'm', 'm', 'u', 'n', 'e', 't', 'o', 'c', 'a', 't', 'n', 'i', 'p']
[24, 8, 7]
0 24
Iamacatthatisoddlyimmune
tocatnip
1 8
Iamacatt
hatisoddlyimmune
tocatnip
您可以使用python enumerate()
函數在單個循環中生成一系列索引/值對。 然后,您可以使用list.insert(pos, val)
方法插入所需的字符。
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FIELD_TWO = [7,8,24]
last_i = len(XML_FIELD_TWO) - 1
for i,p in enumerate(XML_FIELD_TWO):
ch = '\r' if i < last_i and XML_FIELD_TWO[i+1] == p+1 else '\n'
XML_FIELD_ONE.insert(p, ch)
print(XML_FIELD_ONE)
這是一個線性算法,可以實現您要執行的操作。 實際上,在這里使用try-except
非常合適,但是除了 :
>>> XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
>>> XML_FIELD_TWO = [7,8,24]
>>> insertions = 0
>>> for i, e in enumerate(XML_FIELD_TWO):
... try:
... cont = e + 1 == XML_FILED_TWO[i+1]
... except IndexError:
... cont = False
... if cont:
... XML_FI.insert(e+1+insertions, '\r\n')
... XML_FIELD_ONE.insert(e+1+insertions, '\r\n')
... else:
... XML_FIELD_ONE.insert(e + insertions, '\n')
... insertions += 1
...
>>> print("".join(XML_FIELD_ONE))
Iamacatt
hatisoddlyimmune
tocatnip
>>>
我跟蹤插入數量,該數量會偏移.insert
使用的索引,以保持原始索引正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.