import İfadesini Ek Yükü

import ifadesi herhangi bir yerde çalıştırılabilir. Genelde görünürlüklerini sınırlamak ve/veya ilklendirilme zamanlarını kısaltmak için fonksiyonlar içine yerleştirmek daha faydalıdır. Her ne kadar Python yorumlayıcısı aynı modulü çok sayıda import etmeyecek şekilde en iyileştirilmiş olsa da bir import ifadesinin tekrar tekrar çalıştırılması bazı durumlarda performansı etkileyebilir.

Aşağıdaki iki kod örneğini göz önüne alalım (Bu örnek Greg McFarlane'den, bu örneği comp.lang.python python-list (at) python.org listesinde ve daha sonra kendisine özel olarak başka bir yerde sorulmuş olarak buldum):

		def doit1():
			import string             ###### import ifadesi fonksiyon içerisinde
    			string.lower('Python')

		for num in range(100000):
			doit1()
	

veya

		import string             ###### import ifadesi fonksiyon dışında
		def doit2():
			string.lower('Python')
		
		for num in range(100000):
    			doit2()
	

Her ne kadar karakter dizisine referans evrensel olsa da doit2 fonksiyonu doit1'den daha hızlı çalışacaktır. Aşağıda Python 2.3 ile ve yeni timeit modulü kullanılarak çalıştırılmış ve ikincisinin birincisinden ne kadar hızlı olduğunu gösteren bir örnek bulunmaktadır:

		>>> def doit1():
			import string
			string.lower('Python')
				...
		>>> import string
		>>> def doit2():
			string.lower('Python')
				...
		>>> import timeit
		>>> t = timeit.Timer(setup='from __main__ import doit1', stmt='doit1()')
		>>> t.timeit()
		11.479144930839539
		>>> t = timeit.Timer(setup='from __main__ import doit2', stmt='doit2()')
		>>> t.timeit()
4.6661689281463623
	

Karakter dizisi işlemleri Python sürüm 2.0 ile gelmiştir. Bu sürüm ile import ifadesinden tamamen kaçınma ve daha hızlı bir çalışma sağlanmıştır.

		def doit3():
			'Python'.lower()
		
		for num in range(100000):
			doit3()
		
		timeit ipsatı da şu şekilde:
		
		>>> def doit3():
			'Python'.lower()
				...
		>>> t = timeit.Timer(setup='from __main__ import doit3', stmt='doit3()')
		>>> t.timeit()
		2.5606080293655396
	

Yukarıdaki örnek açık şekilde icat edilmiş gibi durmaktadır, fakat genel prensibi sağlamaktadır.

Özellikle dahil edilen modül gereksinim duyulmayabilecekse fonksiyon içerisine import ifadesi koymak modulün ilklendirilmesini hızlandırabilir. Bu genelde "tembel" eniyileştirme olarak bilinir. Gerekli olduğunu düşündüğünüz ana kadar işten (oldukça pahalı bir import gerektiren modulü import etme) kaçınmaktır.

Bu, eğer modul tamamen import edilmediyse (başka bir modülden) önemli bir başarımdır. Eğer modül hali hazırda yüklenmiş ise (string ve re gibi pek çok standart modülde olduğu gibi) import idafesinden kaçınmak bir başarım sağlamayacaktır. Hangi modüllerin yüklendiğini görmek için sys.modules'e bakınız:

		email = None
		
		def parse_email():
			global email
			if email is None:
        			import email
	

Bu şekilde email modülü parse_email() fonksiyonunun ilk çağrımında sadece bir kere import edilecektir.