Рубрики

Советы по оптимизации для кода Python

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

  1. Используйте встроенные функции и библиотеки: встроенные функции, такие как map (), реализованы в C-коде. Таким образом, интерпретатору не нужно выполнять цикл, это дает значительное ускорение.
    Функция map () применяет функцию к каждому члену итерируемого и возвращает результат. Если имеется несколько аргументов, map () возвращает список, состоящий из кортежей, содержащих соответствующие элементы из всех итераций.

    # Программа Python для иллюстрации функций библиотеки
    # сэкономить время при кодировании на примере map ()

    import time

      
    # медленнее (без карты ())

    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

      
    # Быстрее (Использует встроенную карту функций ())

    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
    
    

    Пакеты зависят от платформы, что означает, что нам нужен соответствующий пакет для платформы, которую мы используем. Если мы выполняем строковую операцию, рассмотрите возможность использования существующего модуля «коллекций», такого как deque, который очень оптимизирован для наших целей.

    # Программа Python для иллюстрации
    # импортировать контейнер в виде списка с
    # быстро добавляется и всплывает на любом конце

    from collections import deque

    s = 'geek'

      
    # сделать новую деку

    d = deque(s)

      
    # добавить новую запись на правой стороне

    d.append('y')

      
    # добавить новую запись в левую сторону

    d.appendleft('h'

    print d

      

    d.pop() # вернуть и удалить самый правый элемент

      

    d.popleft() # вернуть и удалить самый левый элемент

      
    # печать списка в обратном порядке

    print list(reversed(d)) 

    Выход:

    deque(['h', 'g', 'e', 'e', 'k', 'y'])
    ['k', 'e', 'e', 'g']
    

    # импорт инструментов итерации

    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. Использовать ключи для сортировки: в Python мы должны вместо этого использовать аргумент key для встроенной сортировки, что является более быстрым способом сортировки.

    # Программа Python для иллюстрации
    # использование ключей для сортировки

    somelist = [1, -3, 6, 11, 5]

    somelist.sort()

    print somelist

      

    s = 'geeks'

    # используйте sorted (), если вы не хотите сортировать на месте:

    s = sorted(s)

    print s

    Выход:

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

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

  3. Оптимизация циклов: написание идиоматического кода: это может показаться нелогичным, но написание идиоматического кода сделает ваш код быстрее в большинстве случаев. Это потому, что Python был разработан, чтобы иметь только один очевидный / правильный способ выполнения задачи.
    Например (Конкатенация строк):

    # Программа Python для иллюстрации использования
    # оптимизированные циклы для более быстрого кодирования

      
    # slow O (n ^ 2) - (Примечание: в последних реализациях это O (n))

    s = 'hellogeeks'

    slist = ''

    for i in s:

        slist = slist + i

    print slist

          
    # конкатенация строк (идиоматическая и быстрая O (n))

    st = 'hellogeeks' 

    slist = ''.join([i for i in s])

    print slist

      
    # Лучший способ перебора диапазона

    evens = [ i for i in xrange(10) if i%2 == 0]

    print evens

      
    # Менее быстро

    i = 0

    evens = []

    while i < 10:

        if i %2 == 0: evens.append(i)

            i += 1

    print evens

      
    # медленный

    v = 'for'

    s = 'geeks ' + v + ' geeks'

    print s

      
    # быстро

    s = 'geeks %s geeks' % v

    print s

      

    hellogeeks
    [0, 2, 4, 6, 8]
    geeks for geeks
    

    Каждый раз, выполняя цикл для s (i), Python оценивает метод. Однако, если вы поместите оценку в переменную, значение уже известно, и Python может выполнять задачи быстрее.

  4. Попробуйте несколько подходов к кодированию : использование точно одного и того же подхода к кодированию при каждом создании приложения почти наверняка приведет к тому, что приложение будет работать медленнее, чем могло бы.
    Например (инициализация элементов словаря):

    # Программа Python для иллюстрации попыток
    # несколько подходов кодирования
    # для получения более быстрого результата
    # помедленнее

    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] += 1

    print mydict

      
    # Быстрее

    mydict = {'g':1,'e':1,'e':1,'k':1}

    word = 'geeksforgeeks'

    for w in word:

        try:

            mydict[w] += 1

        except KeyError:

            mydict[w] = 1

    print mydict

    {'e': 5, 'g': 3, 'f': 1, 'k': 3, 'o': 1, 's': 2, 'r': 1}
    

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

  5. Использовать xrange вместо range: range () — возвращает список чисел, созданных с помощью функции range ().
    xrange () — эта функция возвращает объект генератора, который может использоваться для отображения чисел только путем зацикливания. По запросу отображается только определенный диапазон, и поэтому он называется «отложенная оценка».

    # помедленнее

    x = [i for i in range(0,10,2)]

    print x

      
    # Быстрее

    x = [i for i in xrange(0,10,2)]

    print x

    [1, 3, 5, 7, 9]
    

    Это может сэкономить вашу системную память, потому что xrange () будет выдавать только один целочисленный элемент в последовательности за раз. В то время как range (), он дает вам весь список, который не требует дополнительных затрат для зацикливания.

  6. Используйте множественное назначение Python для замены переменных : это элегантно и быстрее в Python.

    # Python-программа для иллюстрации обмена
    # переменной в одной строке

      
    # помедленнее

    x = 2

    y = 5

    temp = x

    x = y

    y = temp

    print x,y

      

    x,y = 3,5

    # Быстрее

    x, y = y, x

    print x,y

    5 2
    5 3
    
  7. Если возможно, используйте локальную переменную: Python быстрее извлекает локальную переменную, чем извлекает глобальную переменную. То есть избегайте «глобального» ключевого слова. Поэтому, если вы собираетесь часто обращаться к методу (внутри цикла), попробуйте записать его в переменную.

    # Программа Python для иллюстрации попыток
    # использовать локальные переменные для создания кода
    # беги быстрее

    class Test:

        def func(self,x):

            print x+x

      
    # Объявление переменной, которая назначает объект метода класса

    Obj = Test()

    mytest = Obj.func # Объявление локальной переменной

    n = 2

    for i in range(n):

        mytest(i) # быстрее чем Obj.func (i)

    0
    2
    


Ссылки:

Эта статья предоставлена Афзалом Ансари . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Рекомендуемые посты:

Советы по оптимизации для кода Python

0.00 (0%) 0 votes