Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 15, 2011 09:05:26

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Есть код:

def readDbf(filename):

db = Dbase()

db.open(filename)

num = db.get_numrecords()

rec = []

for i in xrange(0, num):

record = db.get_record_with_names(i)

if record['DUP']=='201101':

rec.append(record)

db.close()

return rec
Пытаюсь изменить с использованием выражения-генератора:
def readDbf(filename):

db = Dbase()

db.open(filename)

num = db.get_numrecords()

rec = (db.get_record_with_names(i) for i in xrange(0, num))

db.close()

return rec
Работает гораздо быстрее (обрабатывается около миллиона записей), но не пойму как добавить в генератор условие из первого кода: if record=='201101'



Офлайн

#2 Фев. 15, 2011 10:34:01

Борисенков Сергей
От:
Зарегистрирован: 2011-01-11
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Читаем: http://docs.python.org/whatsnew/2.4.html#pep-289-generator-expressions

rec = (db.get_record_with_names(i) for i in xrange(0, num) if db.get_record_with_names(i)['DUP']=='201101')



Офлайн

#3 Фев. 15, 2011 10:40:06

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Я просто думал может есть другой способ, что бы не вызывать функцию дважды. Так намного увеличивается время обработки.



Офлайн

#4 Фев. 15, 2011 11:00:35

Борисенков Сергей
От:
Зарегистрирован: 2011-01-11
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Bujhm666
Я просто думал может есть другой способ, что бы не вызывать функцию дважды. Так намного увеличивается время обработки.
А в чем проблема?
rec = (db.get_record_with_names(i) for i in xrange(0, num) if db.get_record_with_names(i)['DUP']=='201101')
меняем на функцию-генератор:
def rec(num):
for i in xrange(0,num):
res=db.get_record_with_names(i)
if(res['DUP']=='201101'):
yield res



Офлайн

#5 Фев. 15, 2011 12:15:39

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Надеюсь я правильно понял?

def rec(num, db):
for i in xrange(0,num):
res = db.get_record_with_names(i)
if(res['DUP'] == '201101'):
yield res

def readDbf(filename):
db = Dbase()
db.open(filename)
num = db.get_numrecords()
records = []
for record in rec(num, db):
records.append(record)
db.close()
return records



Офлайн

#6 Фев. 15, 2011 12:50:32

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Вопрос по генераторам

И какой в этом смысл, если вы все равно делаете список в результате?



Офлайн

#7 Фев. 15, 2011 14:07:32

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Просто пытался оптимизировать. И так как мне нужен именно список, наверно придется остановиться на генераторе списков:

rec = [db.get_record_with_names(i) for i in xrange(0,num) if(db.get_record_with_names(i)['DUP'] == '201101')]
Протестировал выражение-генератор, функцию-генератор и генератор списков, время выполнения практически одинаковое. 250 000 записей в районе 8-9 секунд на не особо мощном компе.



Офлайн

#8 Фев. 15, 2011 14:58:15

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Вопрос по генераторам

Вы уверены, что вам нужен именно список? Что вы дальше делаете с тем, что вернула ваша readDbf?



Офлайн

#9 Авг. 1, 2022 15:15:23

Evol
Зарегистрирован: 2022-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по генераторам

https://realpython.world/basics/list-generator.html вот хорошая статья по вашему вопросу, можете ознакомиться. Да и вообще на этом сайте много полезных статей, пользуйтесь, может быть пригодится кому ни будь

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version