龙空技术网

7个必须了解的Python优化技巧

数据大视界 207

前言:

现时看官们对“python程序优化”可能比较看重,同学们都想要知道一些“python程序优化”的相关知识。那么小编在网上搜集了一些对于“python程序优化””的相关资讯,希望咱们能喜欢,兄弟们快快来了解一下吧!

译自Geeksforgeeks

介绍

在本文中,讨论了一些有关 Python Code的有趣的优化技巧。这些技术有助于在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.003225['G', 'E', 'E', 'K', 'S']Time spent in builtin function is: 0.001234

这些软件包是特定于平台的,这意味着我们需要适合所用平台的软件包。如果我们正在执行字符串操作,请考虑使用现有的模块“集合”(例如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.使用key进行排序

在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()–此函数返回只能通过循环显示数字的生成器对象。根据需要仅显示特定范围,因此称为“惰性评估”。

# 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 = 2 for i in range(n):  mytest(i) # faster than Obj.func(i) 

输出

02

如果发现任何不正确的地方,或者想分享有关上述主题的更多信息,欢迎反馈。

译自Geeksforgeeks

标签: #python程序优化