[python] a bit about performance...
От: Denys V. Украина http://ua.linkedin.com/in/dvalchuk
Дата: 17.12.09 17:02
Оценка:
правда, что в питоне быстрее созать новый лист по условию чем удалить элементы по условию из текущего?

типа так быстрее
l = [ i for i in l if str(i) != '1']


чем
toRemove = []
n = 0
for i in l:
  if i == '1':
    toRemove.append(n)
    pass
  pass
for j in toRemove:
  del l[j]
  pass
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re: [python] a bit about performance...
От: Critical Error ICQ: 123736611
Дата: 18.12.09 02:09
Оценка: 8 (1) +1
Здравствуйте, Denys V., Вы писали:

DV>правда, что в питоне быстрее созать новый лист по условию чем удалить элементы по условию из текущего?


Правда. Кстати твой пример содержит ошибку. Я провел собственные эксперименты. Надо сказать, в питоне довольно трудно удалить элемент по кастомному условию. Связано это с тем, что в питоне нельзя удалить элемент по итератору. Более-менее адекватный способ в сырце ниже...

from time import time
from random import randint
from copy import copy

ll = [randint(0,2) for j in xrange(0,100000)]

l = copy(ll)
t = time()
l = [i for i in l if i != 1]
print time()-t, len(l)
l1 = l

l = copy(ll)
t = time()
n = len(l)
while n:
    n -= 1
    if not l[n] != 1:
        del l[n]
print time()-t, len(l)
l2 = l

for a,b in zip(l1, l2):
    if a != b:
        print 'not equal'
        break


Результат:
0.0249998569489 66747
1.17900013924 66747
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.