sorted(set(range(2,n+1)).difference(set((p * f) for p in range(2,int(n**0.5) + 2) for f in range(2,(n/p)+1))))
Автор: Viktor
sorted(set(range(2,n+1)).difference(set((p * f) for p in range(2,int(n**0.5) + 2) for f in range(2,(n/p)+1))))
Автор: Viktor
Задача: имеем на входе строку, слова в которой разделены пробелом. Если в строке попадается число, то вставляем точки как разделители разрядов. На выходе нужно получить строку.
Например: 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’
Задача: из двух списков получить словарь, где первый список ключи словаря, второй — значения
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
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
# coding: utf8
import pymongo
from pymongo import Connection
connection = Connection()
# Удалить БД, если она существует
connection.drop_database("test_database")
# Выбираем БД
db = connection.test_database
# либо: db = connection["test_database"]
# Удалить коллекцию
db.drop_collection('users')
# Добавление документов в колекцию 'users'
db.users.save( { 'name':'user 1', 'level':1 } )
db.users.save( { 'name':'user 2', 'level':2 } )
db.users.insert( { 'name':'user 3', 'level':3 } )
# Полное имя колекции
print db.users.full_name
# Получить все документы
for user in db.users.find():
print user
# Выбрать конкретные атрибуты
users = db.users.find({},{ 'login':1, 'name':1 })
# Получить один документ по условию
user = db.users.find_one({'name':'user 1'})
# Получить/установить значение
print user['level']
user['level'] = 7
# Сохранить документ
db.users.save(user)
# Удалить документ
db.users.remove(user)
# Установить значение в документе
db.users.update({ 'name':'user 2' }, { "$set": { 'level':5 } })
# Кол-во документов
print 'Count',db.users.count()
print 'Count lvl=2',db.users.find({'level':2}).count()
# Сортировка
for user in db.users.find().sort('level'):
print user
# в обратном порядке: .sort('level',pymongo.DESCENDING)
# Сортировка по нескольким атрибутам
db.users.find({}).sort( [('status',1),('level',-<
span class="mi">1)] )
# Ограничение выборки, пропустить один документ и выбрать не более двух
for user in db.users.find().skip(1).limit(2):
print user
# Условия
for user in db.users.find().where('this.name == "user 2" || this.level>3'):
print user
# Выбрать неповторяющиеся записи
for user in db.users.distinct('level'):
print user
# Поиск регулярным выражением
import re
regex = re.compile('^us', re.I | re.U)
result = db.collection.find({ 'name':regex })
Автор: D1VER
Дата публикации: 2013-12-16T05:15:00.002-08:00
Выход за границы области экрана
>>> self.pos[0] = (self.pos[0] + self.vel[0]) % WIDTH
>>> self.pos[1] = (self.pos[1] + self.vel[1]) % HEIGHT
pos — координаты центра движущейся фигуры
Увеличение скорости астероидов в зависимости от счета score
# increase rock's velocity using score
for rock in rock_group:
for i in range(2):
rock.vel[i] = rock.init_vel[i] + (rock.init_vel[i] * score * 0.03)
или
rock_vel[i] = rock_vel[i] * (1 + score / 3)
Столкновение спрайтов (p q — координаты центров сталкивающихся спрайтов, dist — расчет дистанции между спрайтами)
def dist(p, q):
return math.sqrt((p[0] — q[0]) ** 2 + (p[1] — q[1]) ** 2)
def collide(self, other_object):
return dist(self.pos, other_object.pos) <= self.radius + other_object.radius
Автор: Viktor