Что является более питонным для удаления массива? - PullRequest
2 голосов
/ 13 сентября 2009

Я удаляю элемент из массива, если он существует.

Два способа сделать это

Путь № 1

# x array, r item to remove
if r in x :
  x.remove( r )

Путь № 2

try :
  x.remove( r )
except :
  pass

Время показывает, что попытка / исключение может быть быстрее

(иногда я получаю :)

1.16225508968e-06
8.80804972547e-07

1.14314196588e-06
8.73752536492e-07
import timeit

runs = 10000
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

code1 ="""
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

if r in x :
  x.remove(r)
"""
print timeit.Timer( code1 ).timeit( runs ) / runs

code2 ="""
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

try :
  x.remove( r )
except :
  pass
"""
print timeit.Timer( code2 ).timeit( runs ) / runs

Что более питонично?

Ответы [ 5 ]

6 голосов
/ 13 сентября 2009

Я всегда делал первый способ. if in читает намного яснее, чем обработка исключений.

5 голосов
/ 13 сентября 2009

это будет:

try:
  x.remove(r)
except ValueError:
  pass

Кстати, вы должны были попытаться удалить элемент, которого нет в списке, чтобы провести всестороннее сравнение.

3 голосов
/ 13 сентября 2009

Скорость зависит от соотношения попаданий и промахов. Чтобы быть питоническим, выберите более понятный метод.

Лично я думаю, что способ № 1 более понятен (требуется меньше строк, чтобы иметь блок «если», а не блок исключения, а также используется меньше места для мозга). Это также будет быстрее, когда будет больше попаданий, чем промахов (исключение обходится дороже, чем пропуск блока if).

2 голосов
/ 13 сентября 2009

Попробуй / кроме способа

1 голос
/ 13 сентября 2009

Первый способ выглядит чище. Второе выглядит как много дополнительных усилий только для удаления элемента из списка.

В PEP-8 об этом ничего нет, так что, какой бы вы ни предпочли, это «реальный» ответ.

Говоря о PEP-8 ... наличие этого пространства перед двоеточием подпадает под определение "посторонние пробелы".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...