2013-08-31 3 views
3

Мне просто интересно, есть ли более эффективный способ записи следующего цикла, поскольку мне нужно ускорить мою программу?Python loop efficiency

for char in data: 
    if char in self.key: 
     match += chr(self.key.index(char)) 

Заранее благодарим за любую помощь.

+0

Что такое 'self.key', список? –

ответ

7

Заменитьself.key со словарем; это тестирование членства в списке, а также звонки .index(), которые стоят вам самой высокой производительности; оба требуют сканирования по всему списку.

Используйте str.join(), чтобы объединить ряд символов; который строит один нового объекта строки вместо N новых объектов:

keys = {char: chr(i) for i, char in enumerate(self.key)} 
match = ''.join([keys[char] for char in data if char in keys]) 

статуса тесты Словаря и поиски являются O (1) постоянная стоимостью; путем создания словаря с значениями char(..) вы можете избежать нескольких вызовов chr() за значение; в зависимости от того, сколько значений повторно используется, вместо этого можно быстрее использовать char: i и переместить вызов chr() в список.

+0

Немного смущен: почему бы не «match =» .join (keys [char] для char в данных, если char в ключах) 'work? Простите меня, если это что-то глупое, я пропала. – iCodez

+0

@iCodez: см. [Понимание списка без \ [\], Python] (http://stackoverflow.com/a/9061024) по причине; из-за того, как 'str.join()' управляет списком comp, более эффективен, чем выражение генератора. –

+0

Спасибо всем, кто ответил. Много вариантов, пошел с ответом Martijn, поскольку у него было больше всего голосов. Не обижайтесь на всех тех, кто предоставил другие большие альтернативы. Это было намного быстрее, чем моя попытка. Еще раз спасибо Клинтон. –

3
match = ''.join(char for char in data if char in self.key) 
+0

Спасибо всем, кто ответил. Много вариантов, пошел с ответом Martijn, поскольку у него было больше всего голосов. Не обижайтесь на всех тех, кто предоставил другие большие альтернативы. Это было намного быстрее, чем моя попытка. Еще раз спасибо Клинтон. –

4

Да, используйте словарь вместо списка. index работа идет медленно (это O(log(N)) как это проверить, если элемент находится в списке, в то время как словарь доступа O(1))

self.map = dict(zip(self.key, range(len(self.key))) 
for char in data: 
    if char in self.map: 
     match += chr(self.map[char]) 

также изменить константу, добавив к строке только один конкатенации, используя join и генератор выражение в (во избежание создания списка):

result = ''.join(chr(self.map[char]) for char in data if char in self.map) 
+0

Спасибо всем, кто ответил. Много вариантов, пошел с ответом Martijn, поскольку у него было больше всего голосов. Не обижайтесь на всех тех, кто предоставил другие большие альтернативы. Это было намного быстрее, чем моя попытка. Еще раз спасибо Клинтон. –

+0

@ViktorKerkez: Использование понимания списка на самом деле происходит быстрее в случае 'join (...)'. –