Починаючи з Python3
map
більше не повертає a list
але a mapObject
, таким чином відповідь буде виглядати приблизно так
>>> map(lambda x:x.strip(),l)
<map object at 0x7f00b1839fd0>
Ви можете прочитати більше про це на Що нового в Python 3.0 .
map()
і filter()
повернути ітератори. Якщо вам справді потрібнаlist
, це швидке виправлення, наприкладlist(map(...))
Тож які шляхи пройти через це?
Випадок 1 - list
дзвінок закінченийmap
допомогою alambda
map
повертає ітератор . list
- це функція, яка може перетворити ітератор у список. Отже, вам потрібно буде обговорити list
дзвінок map
. Отже, відповідь тепер стає:
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> list(map(lambda x:x.strip(),l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Дуже добре, ми отримуємо результат. Тепер ми перевіряємо, скільки часу потрібно для виконання цього фрагмента коду.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))"
100000 loops, best of 3: 2.22 usec per loop
2,22 мікросекунди. Це не так погано. Але чи є більш ефективні способи?
Випадок 2 - list
дзвінок закінчено map
без OUT alambda
lambda
багато людей із спільноти Python (у тому числі Гвідо ) не бачать . Крім того, це значно зменшить швидкість програми. Отже, нам потрібно якомога більше уникати цього. Функція верхнього рівняstr.strip
. Тут нам допомагають.
map
Може бути переписано без використання lambda
використання в str.strip
якості
>>> list(map(str.strip,l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
А тепер про час.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))"
1000000 loops, best of 3: 1.38 usec per loop
Фантастично. Ви можете побачити різницю в ефективності між двома способами. Це майже на 60% швидше. Таким чином, підхід без використання a lambda
тут кращий вибір.
Випадок 3 - Дотримання вказівок, регулярний спосіб
Ще одним важливим моментом у " Що нового в Python 3.0" є те, що він радить нам уникатиmap
де це можливо.
Особливо хитро map()
називають побічні ефекти функції; правильним перетворенням є використання регулярногоfor
циклу (оскільки створення списку було б просто марним).
Тож ми можемо вирішити цю проблему без map
використання звичайного for
циклу.
Банальним способом вирішення (груба сила) буде:
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> final_list = []
>>> for i in l:
... final_list.append(i.strip())
...
>>> final_list
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Налаштування часу
def f():
l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
final_list = []
for i in l:
final_list.append(i.strip())
import timeit
print(min(timeit.repeat("f()","from __main__ import f")))
І результат.
1.5322505849981098
Як бачите, груба сила тут трохи повільніша. Але це, безумовно, легше для читання звичайним програмістом, ніж map
пункт.
Випадок 4 - розуміння списку
Список розуміння тут також можливо і таке ж , як і в python2.
>>> [i.strip() for i in l]
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Тепер щодо термінів:
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]"
1000000 loops, best of 3: 1.28 usec per loop
Як бачите, розуміння списку є більш ефективним, ніж map
(навіть без а lambda
). Звідси правило великого пальця в Python3 полягає у використанні розуміння списку замістьmap
Випадок 5 - Механізми на місці та космічна ефективність ( TMT )
Останній спосіб - це внести зміни до місця в самому списку. Це заощадить багато місця в пам'яті. Це можна зробити за допомогою enumerate
.
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> for i,s in enumerate(l):
... l[i] = s.strip()
...
>>> l
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Результат часу буде 1.4806894720022683
. Але однак цей спосіб є космічно ефективним.
Висновок
Порівняльний список часу (як Python 3.4.3, так і Python 3.5.0)
----------------------------------------------------
|Case| method | Py3.4 |Place| Py3.5 |Place|
|----|-----------------|-------|-----|-------|-----|
| 1 | map with lambda | 2.22u | 5 | 2.85u | 5 |
| 2 | map w/o lambda | 1.38u | 2 | 2.00u | 2 |
| 3 | brute-force | 1.53u | 4 | 2.22u | 4 |
| 4 | list comp | 1.28u | 1 | 1.25u | 1 |
| 5 | in-place | 1.48u | 3 | 2.14u | 3 |
----------------------------------------------------
Наостанок зауважте, що розуміння списку - найкращий спосіб, а map
використання lambda
- найгірший. Але знову --- ТІЛЬКИ В ПІФОНІ3