2016-11-05 4 views
4

С точки зрения производительности (время или память) это лучше сделать:Наиболее производительный способ сделать импорт

import pandas as pd 

или

from pandas import DataFrame, TimeSeries 

ли, что лучше всего зависит от того, сколько классы, которые я импортирую из пакета?

Кроме того, я видел, что люди делают такие вещи, как:

def foo(bar): 
    from numpy import array 

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

+0

Одна мысль за импорт из функции заключается в том, чтобы избежать импорта (возможно, удалённого) модуля, если функция не вызывается. – chepner

ответ

6

Это микро-оптимизация, и вы не должны беспокоиться об этом.

Модули загружаются раз за процесс Python. Весь код, который затем импортирует, должен только связывать имя с модулем или объектами, определенными в модуле. Это связывание чрезвычайно дешево.

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

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

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

+0

Cheers. На самом деле я не планировал использовать это для улучшения реального кода. Это было просто академическое любопытство. – Batman

1

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

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

Что касается "import pandas as pd" vs "from pandas import DataFrame, TimeSeries", этот вопрос имеет несколько проблем (как и все вопросы), с гораздо более важными, чем другие. Возникает вопрос о пространстве имен, возникает вопрос о читаемости, и есть вопрос о производительности. Производительность, как утверждает Марджин, должна способствовать примерно 0,0001% решения. Читаемость должна составлять около 90%. Пространство имен только 10%, так как это можно легко смягчить.

Лично, на мой взгляд, и import X as Y, и form X import Y - это плохая практика, потому что явный лучше, чем неявный. Вы не хотите быть на линии 2000, пытаясь запомнить, какой пакет «calculate_mean» исходит из-за того, что он не упоминается нигде в коде. Когда я впервые начал использовать numpy, я копировал/вставлял код из Интернета и не мог понять, почему я не сделал/не смог pip install np.Это, очевидно, не проблема, если у вас есть уже существовавшие знания о том, что «np» - это python для «numpy», но это глупое и бессмысленное замешательство для трех сохраняемых им букв. Это произошло от numpy. Используйте numpy.

1

Существует преимущество импорта модуля внутри функции, о которой еще не упоминалось: это дает вам некоторый контроль над загрузкой модуля. Фактически, хотя ответ @JJ рекомендует импортировать все модули как можно раньше, этот контроль позволяет вам отложить, загружая модуль.

Зачем вам это нужно? Ну, в то время как это не улучшит реальную производительность вашей программы, это может улучшить воспринимаемое производительность, и в силу этого, опыт пользователя:

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

MSDN: Best practices for your app's startup performance

Загрузка каждого модуля в начале основного сценария может занять некоторое время. Например, одно из моих приложений использует структуру Qt, Pandas, Numpy и Matplotlib. Если все эти модули импортируются прямо в начале приложения, внешний вид пользовательского интерфейса задерживается на несколько секунд. Пользователи не любят ждать, и они, вероятно, воспримут ваше приложение как обычно медленное из-за этого ожидания.

Но если, например, Matplotlib импортируется только из тех функций, которые вызывается всякий раз, когда пользователь выдает команду plot, время запуска заметно уменьшается. Пользователь не воспринимает ваше приложение таким вялым, что может привести к лучшему опыту пользователя.

Смежные вопросы