Как улучшить производительность? - PullRequest
0 голосов
/ 22 июня 2010

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

Я попробовал psyco .. т.е. я установил psyco и добавил две строки наначало моего кода

import psyco
psyco.full()

Не знаю, так ли это, как использовать psyco .. если это неправильно.Пожалуйста, скажите мне, как использовать psyco .. потому что я добавил это и не нашел улучшения ..

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

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

Я использую Python 2.6 и Windows Vista .. Пожалуйста, сообщите методы методов для значительного увеличения скорости выполнения всего кода .. по крайней мере в 5 раз .. пожалуйста ..

Я не написал свой код в методе, между вами мало методов ... нет главного ...

Да, поскольку немногие предположили, что это проблема с IO-связью ... так как мне нужно вызвать код500 раз, и это включает в себя открытие и закрытие файлов, по крайней мере, 2 на вызов.

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

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

Как повысить производительность для узких мест, связанных с вводом-выводом

Отчаянно ищу помощи

Ответы [ 6 ]

3 голосов
/ 22 июня 2010

Вы могли бы получить намного лучшую производительность, если бы могли переключаться на двоичные форматы файлов. Большая часть вашего кода выполняет синтаксический анализ и обработку строк. Вы много конвертируете строки в float, что медленнее, чем вы думаете.

1 голос
/ 22 июня 2010

Вы вряд ли увидите 5-кратную разницу в производительности, просто изменив код.

Сначала вы должны взглянуть на улучшение своего алгоритма - используете ли вы лучшие структуры данных для работы? Возможно, использование dict или set в нужном месте может значительно ускорить ваш код.

Написание модуля C не так уж сложно, и это еще один вариант, если вы не можете найти способ улучшить код Python. Обычно вы ожидаете более чем 5-кратного ускорения при использовании кода C.

Может быть, ваша проблема связана с IO. Тогда нужно искать способы повышения производительности IO

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

UPDATE: Похоже, вы открываете и закрываете множество файлов, что, как правило, мучительно медленно работает в Windows.

0 голосов
/ 22 июня 2010

почему бот просто пытается использовать Cython? Вы должны получить гораздо лучшую производительность без изменения какого-либо кода. С небольшим изменением это должно помочь еще больше.

0 голосов
/ 22 июня 2010

Вот одна возможность для оптимизации: вы дважды вызываете get_list с очень похожими аргументами:

join_cost_index_end[index] = get_list(file, float(abs1), fout)
join_cost_index_strt[index] = get_list(file, float(abs2), fout)

Это означает, что большая часть работы в get_list выполняется дважды без веской причины. Перепишите его так, чтобы get_list вызывался один раз, и чтобы он возвращал одновременно index_end и index_strt.

0 голосов
/ 22 июня 2010

Чтобы оптимизировать ваш код для скорости, вы просто должны профилировать его и посмотреть, в чем проблема. Гадание не помогает. Но как только вы узнаете, где больше всего, вы получите больше денег в порядке убывания: улучшение алгоритма, использование более подходящих структур данных, устранение узких мест ресурсов (io, memory, cpu), уменьшение выделения памяти, уменьшение переключения контекста (процессы и подпрограммы).

0 голосов
/ 22 июня 2010

psyco можно использовать так же просто, как import и вызывать psyco.full (). так что вы правы насчет своего психо.

Если вы пытаетесь собрать модуль Python с использованием C / C ++, взгляните на boost :: python

Вы действительно должны опубликовать свой код для дальнейшего анализа.

...