Почему python не импортирует каждый модуль при запуске автоматически?

Я играл с Python 2.7, и все знают, что в начале каждой программы вам всегда нужно импортировать модули. Например:

import random
import time

for x in range(1, 300):
     print random.randint(1,100)
     time.sleep(1)
print "Done!"

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

Конечно, я могу понять, почему он не импортирует вот так:

from random import randint
from time import *

for x in range(1, 300):
     print randint(1,100)
     sleep(1)
print "Done!"

Так как некоторые имена функций могут конфликтовать. Но если вам нужно определить, где функция находится в начале, например, random. в random.randint(1,100).

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

РЕДАКТИРОВАТЬ: я сделал новую версию небольшой программы, которая импортирует каждый модуль, который я могу найти, запустив:

 import sys
 sys.builtin_module_names

Вот результаты:

 x = int(1000000)
def test():
    global x
    x -= 1
    print "Iterations Left: ", x
    import __builtin__
    import __main__
    import _ast
    import _bisect
    import _codecs
    import _codecs_cn
    import _codecs_hk
    import _codecs_iso2022
    import _codecs_jp
    import _codecs_kr
    import _codecs_tw
    import _collections
    import _csv
    import _functools
    import _heapq
    import _hotshot
    import _io
    import _json
    import _locale
    import _lsprof
    import _md5
    import _multibytecodec
    import _random
    import _sha
    import _sha256
    import _sha512
    import _sre
    import _struct
    import _subprocess
    import _symtable
    import _warnings
    import _weakref
    import _winreg
    import array
    import audioop
    import binascii
    import cPickle
    import cStringIO
    import cmath
    import datetime
    import errno
    import exceptions
    import future_builtins
    import gc
    import imageop
    import imp
    import itertools
    import marshal
    import math
    import mmap
    import msvcrt
    import nt
    import operator
    import parser
    import signal
    import strop
    import sys
    import thread
    import time
    import xxsubtype
    import zipimport
    import zlib

def start():
    from timeit import Timer
    t = Timer("test()", "from __main__ import test")
    print t.timeit()

start()

person George    schedule 08.01.2014    source источник
comment
Если вам нужен PHP, вы знаете, где его найти. Наслаждайтесь!   -  person Wooble    schedule 09.01.2014
comment
Вы предпочитаете экономить одну или две строки кода, отказываясь от тонны памяти и времени выполнения?   -  person Paulo Bu    schedule 09.01.2014
comment
В Python есть множество встроенных функций, которые мне никогда не были нужны или которые я никогда не использовал (а я использую Python более 2 лет), и они импортируются по умолчанию. Почему бы нам просто не расширить диапазон импорта?   -  person George    schedule 09.01.2014
comment
Тенденция заключается в удалении встроенных функций, а не в добавлении новых. Зачем засорять глобальное пространство имен кучей мусора?   -  person Wooble    schedule 09.01.2014
comment
Глядя на папку lib на этой машине, я вижу, что там более 5 тысяч файлов в черт знает сколько подкаталогов. Зачем мне просматривать это каждый раз, когда мне нужна функция. Потребуется ли 2 минуты, чтобы найти что-то вроде zip, потому что оно начинается с буквы z?   -  person kylieCatt    schedule 09.01.2014
comment
Проведите небольшой эксперимент: должно быть довольно просто написать программу, которая импортирует все, что есть в стандартной библиотеке. Постройте один, засеките время и посмотрите, насколько он важен   -  person wnnmaw    schedule 09.01.2014
comment
@PauloBu - Импорт всего, конечно, не может занять так много времени - я имею в виду, что импорт 1 вещи занимает миллисекунды, поэтому импорт 100 вещей, вероятно, займет не более секунды.   -  person George    schedule 09.01.2014
comment
@wnnmaw У меня есть - проверьте мой отредактированный ответ (сейчас готово!)   -  person George    schedule 09.01.2014
comment
Я не вижу random, urllib, curses или ctypes. Этот список не полный.   -  person kylieCatt    schedule 09.01.2014
comment
sys.builtin_module_names — это имена модулей, встроенных в интерпретатор, а не отдельных модулей Python или C. Это означает, что их импорт практически бесплатен. Итак, вы на самом деле ничего не протестировали. (Кроме того, вы заметите, что в Python 3.x список намного короче, чем в 2.x, и даже короче в 3.3+, чем в 3.0-3.2.)   -  person abarnert    schedule 09.01.2014
comment
О, есть ли способ проверить это должным образом? Я могу заставить работать только sys.builtin_module_names. Я также обновил свою программу, чтобы засечь время — я скажу вам результат, когда она проделала это 1 000 000 раз!   -  person George    schedule 09.01.2014


Ответы (4)


Потому что вам не нужно все это. Нет смысла загружать каждую библиотеку, если она вам не нужна.

EDIT: я скопировал папку libs в тестовый каталог и превратил ее в пакет, добавив в нее файл __init__.py. В этом файле я добавил:

import os
import glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py")]

Я создал тестовый скрипт, который содержит:

from Lib import *
print('Hello')

Когда я пытаюсь запустить его в оболочке, все, что он делает, это печатает «Дзен Python» Тима Питерса, открывает этот веб-комикс в моем браузере (две вещи, которых я абсолютно не ожидал) и выдает следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\Hannah\Documents\dropBox\Python\test\test.py", line 1, in <module>
    from Lib import *
AttributeError: 'module' object has no attribute 'crypt'

Прежде чем он сделает что-либо из этого, требуется заметное количество времени, около 10-15 секунд.

person kylieCatt    schedule 08.01.2014
comment
Вы не единственный человек, использующий Python. Бифом пользуюсь постоянно. Разработчики рассчитали, что будет использоваться чаще или было наиболее важным для функционирования языка, и сделали это частью базовой библиотеки. Я не языковой дизайнер, но я уверен, что есть разные причины, чтобы разделить все ваши проблемы при этом. - person kylieCatt; 09.01.2014
comment
Начиная с версии CPython 3.4 существует только 68 встроенных функций. Существует 283 модуля и пакета верхнего уровня (26 встроенных, 88 реализованных на C, 169 реализованных на Python). Большинство людей используют значительную часть этих 68 функций. Мало кто использует значительную часть этих 283 модулей. - person abarnert; 09.01.2014

Возможно, вам нужна функция, которая автоматически импортирует библиотеки, используемые в вашем скрипте, без необходимости указывать их в начале. Я нашел это в Интернете http://www.connellybarnes.com/code/autoimp/

Вам просто нужен один импорт в начале вашего скрипта

from autoimp import *

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

Пример в интерактивной оболочке:

>>> random.random()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined
>>> from autoimp import *
>>> random.random()
0.0679000238267422

Из документов:

Для полной лени поместите команду "from autoimp import *" в свой файл PYTHONSTARTUP. Теперь в вашем интерактивном сеансе по умолчанию доступны все модули.

person user2314737    schedule 08.01.2014
comment
явное лучше, чем неявное. - person bruno desthuilliers; 09.01.2014
comment
@ user2314737, когда вы работаете с IDE, явный импорт предоставит вам автозаполнение. Скрытый ...? - person volcano; 09.01.2014
comment
@user2314737 user2314737: когда вы начнете странно себя вести, задаетесь вопросом, откуда какой символ должен был появиться и откуда он на самом деле, и в конечном итоге потратите недели на переписывание своей кодовой базы до нормального состояния с помощью явного импорта, вы поймете что вы были на неправильной стороне лени. NB: здесь я говорю о коде, а не о оболочке Python. - person bruno desthuilliers; 09.01.2014

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

person kindall    schedule 08.01.2014

В Python есть набор модулей, которые всегда загружаются, его вызов __builtins__ : ).

Встроенные модули Python предоставляют оператор import, позволяющий расширить область действия с помощью еще большего количества модулей! Но, как уже говорилось в других сообщениях, решение о том, что вашему скрипту нужны эти модули, зависит только от вас. -- Я рассмотрел вариант изменения __builtins__ и обещаю вам, что явный импорт того, что вам нужно, является лучшим вариантом.


((Большой разглагольствования о том, что нельзя использовать from name import *, вырезано отсюда))


Поскольку большая часть написания python в конечном итоге сводится к упаковке и установке этого написанного python где-то, это мой набор ресурсов для получения дескриптора визвестного import python:

person ThorSummoner    schedule 18.07.2018