python代码自动优化 python代码优化技巧_python代码


在本文中,我们将讨论一些关于更快的Python代码的有趣的优化技巧。这些技术有助于在python代码中更快地生成结果。

1. 使用内置函数和库:内置函数map()是用C代码实现的。因此,解释器不必执行循环,可以大大提高速度。

map()函数将函数应用于iterable的每个成员,并返回结果。如果有多个参数,则map()返回一个包含元组的列表,该元组包含所有可迭代对象中的对应项。

# Python program to illustrate library functions # save time while coding with the example of map() import time   # slower (Without map()) start = time.clock()  s = 'geeks'U = [] for c in s:     U.append(c.upper()) print U elapsed = time.clock() e1 = elapsed - start print "Time spent in function is: ", e1   # Faster (Uses builtin function map()) s = 'geeks'start = time.clock()  U = map(str.upper, s)  print U elapsed = time.clock() e2 = elapsed - start print "Time spent in builtin function is: ", e2
['G', 'E', 'E', 'K', 'S']Time spent in function is:  0.0394747945637['G', 'E', 'E', 'K', 'S']Time spent in builtin function is:  0.0212335531192

这些软件包是特定于平台的,这意味着我们需要适合所使用平台的软件包。如果我们正在执行字符串操作,请考虑使用现有的模块“collections”(例如deque),该模块已针对我们的目的进行了高度优化。

# Python program to illustrate # importing list-like container with  # fast appends and pops on either end from collections import deque s = 'geek'  # make a new deque d = deque(s)   # add a new entry to the right side d.append('y')   # add a new entry to the left side d.appendleft('h')  print d   d.pop() # return and remove the rightmost item   d.popleft() # return and remove the lefttmost item   # print list deque in reverse print list(reversed(d))

输出:

deque(['h', 'g', 'e', 'e', 'k', 'y'])['k', 'e', 'e', 'g']
# importing iteration tools import itertools iter = itertools.permutations([1,2,3]) print list(iter)

输出:

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

2. 使用keys进行排序:在Python中,我们应该改用内置排序的key参数,这是一种更快的排序方式。

# Python program to illustrate # using keys for sorting somelist = [1, -3, 6, 11, 5] somelist.sort() print somelist   s = 'geeks'# use sorted() if you don't want to sort in-place: s = sorted(s) print s

输出:

[-3, 1, 5, 6, 11]['e', 'e', 'g', 'k', 's']

在每种情况下,列表都是根据您选择作为key参数一部分的索引进行排序的。这种方法对字符串和数字都适用。

3. 优化循环:编写惯用代码,这听起来可能违反直觉,但编写惯用代码在大多数情况下会使代码更快。这是因为Python被设计成只有一种明显/正确的方法来完成任务。

例如(字符串串联):

# Python program to illustrate using # optimized loops for faster coding   # slow O(n^2) - ( Note: In latest implementations it is O(n) ) s = 'hellogeeks'slist = '' for i in s:     slist = slist + i print slist       # string concatenation (idiomatic and fast O(n)) st = 'hellogeeks' slist = ''.join([i for i in s]) print slist   # Better way to iterate a range evens = [ i for i in xrange(10) if i%2 == 0] print evens   # Less faster i = 0evens = [] while i < 10:     if i %2 == 0: evens.append(i)         i += 1print evens   # slow v = 'for's = 'geeks ' + v + ' geeks'print s   # fast s = 'geeks %s geeks' % v print s
hellogeeks[0, 2, 4, 6, 8]geeks for geeks

每次运行到s(i)的循环时,Python都会评估该方法。但是,如果将评估放在变量中,则该值是已知的,Python可以更快地执行任务。

4. 尝试多种编码方法:每次创建应用程序时,都使用完全相同的编码方法几乎可以肯定会导致某些情况下应用程序的运行速度比实际运行速度慢。

例如(初始化字典元素):

# Python program to illustrate trying # multiple coding approaches  # for getting faster result # slower mydict = {'g':1,'e':1,'e':1,'k':1} word = 'geeksforgeeks'for w in word:     if w not in mydict:         mydict[w] = 0    mydict[w] += 1print mydict   # faster mydict = {'g':1,'e':1,'e':1,'k':1} word = 'geeksforgeeks'for w in word:     try:         mydict[w] += 1    except KeyError:         mydict[w] = 1print mydict
{'e': 5, 'g': 3, 'f': 1, 'k': 3, 'o': 1, 's': 2, 'r': 1}

在两种情况下,输出都是相同的。唯一的区别是如何获得输出。

5. 使用xrange代替range:range(),这将返回使用range()函数创建的数字列表。

xrange()函数返回生成器对象,该对象只能用于循环显示数字。根据需要仅显示特定范围,因此称为“惰性评估(lazy evaluation)”。

# slower x = [i for i in range(0,10,2)] print x   # faster x = [i for i in xrange(0,10,2)] print x
[1, 3, 5, 7, 9]

因为xrange()一次只会在一个序列中产生一个整数元素,所以可以节省系统内存。而range()则为您提供了完整的列表,这对于循环来说是不必要的开销。

6. 使用Python多重赋值来交换变量:这在Python中是优雅且快速的。

# Python program to illustrate swapping # of a variable in one line    # slower x = 2y = 5temp = x x = y y = temp print x,y   x,y = 3,5# faster x, y = y, x print x,y
5 25 3

7. 尽可能使用局部变量:Python检索局部变量比检索全局变量更快。也就是说,避免使用“ global”关键字。因此,如果您打算经常(在循环内)访问方法,请考虑将其写入变量。

# Python program to illustrate trying # to use local variables to make code # run faster class Test:     def func(self,x):         print x+x   # Declaring variable that assigns class method object Obj = Test() mytest = Obj.func # Declaring local variable n = 2for i in range(n):     mytest(i) # faster than Obj.func(i)
02