Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2011 15:40:18

Alala
От:
Зарегистрирован: 2011-07-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

Возник с коллегой спор, какой вариант работает быстрее:
1)

a = {'a':[0, 1], 'b':[1, 1], c:[1, 0]}
for x in a:
megafunction(x, a[x][0], a[x][1])
2)
a = {'a':[0, 1], 'b':[1, 1], c:[1, 0]}
for x,y in a.iteritems():
megafunction(x, y[0], y[1])
есть какие-то преимущества одного варианта над другим?



Офлайн

#2 Окт. 20, 2011 16:16:09

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Работа со словарем, какой вариант быстрее?

Вот на таком тесте итератор работает чуть быстрее

#!/usr/bin/env python 
#-*- coding: UTF-8 -*-

import cProfile

a = dict( (i, [i&1, i&2]) for i in xrange(5000000) )
megafunction = lambda a, b, c: a+b-c

def test1():
for x in a:
megafunction(x, a[x][0], a[x][1])

def test2():
for x,y in a.iteritems():
megafunction(x, y[0], y[1])

cProfile.run("test1()")
cProfile.run("test2()")



Офлайн

#3 Окт. 20, 2011 23:13:08

Fibio
От:
Зарегистрирован: 2010-09-14
Сообщения: 74
Репутация: +  2  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

на самом деле тестила несколько раз простые циклы, map и генераторы списков, простые циклы всегда чуть медленнее, а вот map и генераторы дают неоднозначные результаты, даже при выполнении одного и того же выражения (ф-ции), хотя Лутц утверждает что генераторы быстрее. В Вашем варианте преимуществ имхо нет.



Офлайн

#4 Окт. 24, 2011 10:09:22

Alala
От:
Зарегистрирован: 2011-07-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

truporez
Ок, спасибо!
я как-то не догадалась тупо протестить это)))

Вообще, конечно, хотелось бы понять разницу в устройстве



Офлайн

#5 Окт. 24, 2011 10:40:01

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

Alala
их имеет смысл сравнивать только на больших объемах данных. Попробуй сгенерировать словарь на пару тысяч значений и отпрофилируй.

Я так понимаю, что в случае iteritems() всё должно быть эффективнее, потому что с помощью for'а ты как бы приделываешь итератор снаружи к объекту и при этом хранишь его в памяти. Во втором же случае объект сам предоставляет тебе свой интерфейс итератора, который может быть оптимизирован изнутри и который хранит в памяти по умолчанию только один объект одновременно.



Отредактировано (Окт. 24, 2011 10:42:38)

Офлайн

#6 Окт. 24, 2011 18:56:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

1-ый вариант медленнее из за того что там на каждой итерации дваждый идет выборка из словаря по ключу x

Офлайн

#7 Окт. 25, 2011 00:30:03

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

o7412369815963
Не аргумент. Во втором выборка дважды идёт из списка, и то и то выполняется за O(1).



Офлайн

#8 Окт. 25, 2011 10:09:13

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

Enchantner
o7412369815963
Не аргумент. Во втором выборка дважды идёт из списка, и то и то выполняется за O(1).
1) Сравните поиск по ключу в словаре из 5М элементов, и выборка из листа в 2 элемента.
2) В 1 варианте выборки из списка что-ли нет?

Офлайн

#9 Окт. 25, 2011 14:06:16

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Работа со словарем, какой вариант быстрее?

Второй, очевидно, должен быть быстрее; и можно пойти дальше:
>>> for x, (y0, y1) in a.iteritems():

Хотя вряд ли это даст хоть сколько либо ощутимый прирост, даже не исключено падение производительности (создаются новые имена в локальном пространстве).

..bw



Офлайн

#10 Окт. 25, 2011 18:32:40

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со словарем, какой вариант быстрее?

o7412369815963
1) Сравните поиск по ключу в словаре из 5М элементов, и выборка из листа в 2 элемента.
Товарищ, вы знаете, что такое O(1)? Это значит, что выборка из контейнера в общем случае не зависит от количества элементов в нём. В основе списка лежит массив, выборка по индексу (указателю). В основе словаря - хэш-таблица, в которой выборка может затормаживаться коллизиями, которые вряд ли присутствуют в наборе из нескольких элементов.

Но да, согласен, в первом случае идёт двойная выборка.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version