Архив метки: Python

Python нахождение числового палиндрома

«А роза упала на лапу Азора» — палиндром, 131 — числовой палиндром.
Решение: число представляю в виде строки, прохожу по циклу от 0 до половины размера строки и сравниваю последовательно симметрично i и -(i +1). Все одинаковые значения добавляются в список и в конце сравниваю размер списка с половиной размера строки. Если равны — то палиндром.
Дебаг:
x = 1234321
for i in xrange(len(str(x)) // 2):    
    if str(x)[i] == str(x)[-(i + 1)]:
        print str(x)[i] 

Привожу в однострочник:
if len([i for i in xrange(len(str(x)) // 2) if str(x)[i] == str(x)[-(i + 1)]]) == len(xrange(len(str(x)) // 2)):
    print 'Палиндром'

Или красивое решение 🙂

def isPalindrom(n):
    «»»
    Check integer for palindrom
    >>> isPalindrom(131)
    True
    >>> isPalindrom(130)
    False
    «»»
    return str(n) == str(n)[::-1]

Автор: Viktor

Линейный поиск

Линейный, последовательный поиск — алгоритм нахождения заданного значения произвольной функции на некотором отрезке. Данный алгоритм является простейшим алгоритмом поиска и в отличие, например, от двоичного поиска, не накладывает никаких ограничений на функцию и имеет простейшую реализацию. Поиск значения функции осуществляется простым сравнением очередного рассматриваемого значения (как правило поиск происходит слева направо, то есть от меньших значений аргумента к большим) и, если значения совпадают (с той или иной точностью), то поиск считается завершённым.

Читать →

Python добавление разделителей разрядов в числах

Задача: имеем на входе строку, слова в которой разделены пробелом. Если в строке попадается число, то вставляем точки как разделители разрядов. На выходе нужно получить строку.

Например: text =

‘123456’ => ‘123.456’
‘333’ => ‘333’
‘9999999’ => ‘9.999.999’
‘123456 567890’ => ‘123.456 567.890’
‘price is 5799’ => ‘price is 5.799’
‘he was born in 1966th’ => ‘he was born in 1966th’

Читать →

Python создаём словарь из двух списков

Задача: из двух списков получить словарь, где первый список ключи словаря, второй — значения

key_dict = [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]
value_dict = ['I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M']
dict_out = {}

for x, y in zip(key_dict, value_dict):
    dict_out[x] = y

print dict_out

{1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L', 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'}

zip(key_dict, value_dict) создает список такого вида [(1, 'I'), (4, 'IV') …]

Автор: Viktor

Пример ускорения python используя ctypes

Один из вариантов ускорить выполнение кода Python — переписать медленный метод на язык C, с помощью ctypes можно подключать библиотеки написанные на C.
Ниже пример вызова C-метода и сравнение производительности.

1) Пишем метод (файл myfib.c)

unsigned long fib(unsigned long x)
{
if(x < 2) return x;
return fib(x-1) + fib(x-2);
}

2) Компилируем:

gcc -shared -Wl,-soname,myfib.so -o myfib.so -fPIC myfib.c

3) Вызываем из Python и сравниваем с функцией написанной на чистом python:

import ctypes
import timeit

fib = ctypes.CDLL('./myfib.so').fib
fib.restype = ctypes.c_long
fib.argtypes = (ctypes.c_ulong,)

print timeit.timeit('fib(32)', 'from __main__ import fib', number=1)

def pyfib(x):
if x < 2: return x
return pyfib(x-1) + pyfib(x-2)

print timeit.timeit('pyfib(32)', 'from __main__ import pyfib', number=1)

Результат:

0.0463268756866
1.08009696007

В итоге, за счет использования ctypes, мы получили ускорение в 23 раза.

Если использовать оптимизацию при компиляции, то можно получить большую производительность, для этого нужно указать ключ оптимизации:

gcc -O3 -shared -Wl,-soname,myfib.so -o myfib.so -fPIC myfib.c

Варианты ключей оптимизации:
-O1 — Базовая оптимизация
-O2 — GCC выполняет почти все поддерживаемые оптимизации, эта опция уменьшает как время компиляции так и время выполнения сгенерированного кода.
-O3 — Более сильная оптимизация, включает -O2 + некоторые дополнительные опции.

С учетом оптимизации -O3, мы получили такой результат:

0.023335695266
1.08294892311

Это быстрее в 46 раз чем на чистом python.

Тестировалось на ubuntu 12.10, python 2.7

Автор: D1VER
Дата публикации: 2013-12-16T05:21:00.001-08:00