IO Производительность больших файлов с Python 3, что ожидать, узкие места? - PullRequest
1 голос
/ 16 ноября 2010

Как работает нарезка в Python 3?

Я написал небольшую программу, которая обрабатывает 7.1 ГБ строк слов в урезанный формат (инфиксы).

В настоящее время я получаю скорость обработки около 1,3 МБ / с для коллекции файлов. У меня уже есть некоторые улучшения с использованием общих руководств, но я чувствую, что мне может не хватать реальной производительности. Я подозреваю, что узким местом является нарезка строк в функции inFix(), но пока не было найдено более быстрого решения.

Мне не хватает какой-то важной концепции или Python просто не подходит для такой задачи (пока)?

    def inFix(w, infixSize):
        length = len(w)
        if length > infixSize :
            surround = length - infixSize
            pre = surround // 2
            suf = surround - pre
            return w[pre:-suf]
        else: 
            return w<br>
    def infix2g(line):
        return ("i %s %s %s\t%s\ni %s %s %s\t%s\ni %s %s %s\t%s\ni %s %s %s\t%s\ni %s %s %s\t%s\n"
                % ( inFix(line[1],1), inFix(line[2],1), inFix(line[3],1), line[0],
                    inFix(line[1],2), inFix(line[2],2), inFix(line[3],2), line[0],
                    inFix(line[1],3), inFix(line[2],3), inFix(line[3],3), line[0],
                    inFix(line[1],4), inFix(line[2],4), inFix(line[3],4), line[0],
                    inFix(line[1],5), inFix(line[2],5), inFix(line[3],5), line[0]))<br>
    uniOut = open('3-gram.txt', 'wt', encoding='iso-8859-15')
    for line in open('3-gram-1to5_infixes.txt', encoding='iso-8859-15'):
        line = line.split()
        if len(line) != 4:
            continue
        uniOut.write(infix2g(line))</p>

<code>uniOut.close()
</code>

1 Ответ

1 голос
/ 07 февраля 2011

Согласно моему комментарию, вам лучше всего запустить профилировщик над сценарием с меньшим набором данных, чтобы увидеть относительное время.

Тем не менее, есть несколько простых оптимизаций, которые вы можете рассмотреть как можно более низко висящие фрукты.

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

Во-вторых, я бы избегал вызова форматирования строки и использовал бы вместо этого соединение строк:

def infix2g(line):
    fragments = []
    for i in range(5):
        fragments.extend([
            'i ', inFix(line[1], i),
            ' ', inFix(line[2], i),
            ' ', inFix(line[3], i),
            '\t', line[0],
            '\n'])
    return ''.join(fragments)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...