Найти - Пользователи
Полная версия: Вопрос по генераторам
Начало » Python для новичков » Вопрос по генераторам
1
Bujhm666
Есть код:
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'
Борисенков Сергей
Читаем: 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')
Bujhm666
Я просто думал может есть другой способ, что бы не вызывать функцию дважды. Так намного увеличивается время обработки.
Борисенков Сергей
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
Bujhm666
Надеюсь я правильно понял?
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
Ed
И какой в этом смысл, если вы все равно делаете список в результате?
Bujhm666
Просто пытался оптимизировать. И так как мне нужен именно список, наверно придется остановиться на генераторе списков:
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 секунд на не особо мощном компе.
Ed
Вы уверены, что вам нужен именно список? Что вы дальше делаете с тем, что вернула ваша readDbf?
Evol
https://realpython.world/basics/list-generator.html вот хорошая статья по вашему вопросу, можете ознакомиться. Да и вообще на этом сайте много полезных статей, пользуйтесь, может быть пригодится кому ни будь
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB