簡體   English   中英

索引/偏移量性能很糟糕-我在做什么錯? 蟒蛇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM