Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2017 18:32:52

wi34rd
Зарегистрирован: 2016-10-08
Сообщения: 89
Репутация: +  2  -
Профиль   Отправить e-mail  

wi34rd && Shaman

Shaman
https://gist.github.com/wi34rd/ea6284a89af42927f0f03a129af869d4

Раз уж вы любитель больших скоростей, то у меня для вас задачка: http://www.spoj.com/problems/TDPRIMES/ мой рекорд 0.21 с. Кстати эту задачу еще никто не решил на D.

Офлайн

#2 Март 13, 2017 19:08:59

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

wi34rd && Shaman

wi34rd
https://gist.github.com/wi34rd/ea6284a89af42927f0f03a129af869d4
У меня с утра такой вариант:
  
from functools import reduce
from multiprocessing import Pool
from operator import __mul__
 
POOL_SZ = 4
BASE = 10000
CHUNK_SZ = BASE // POOL_SZ + 1
 
 
def reduce_mul(vector):
    return reduce(__mul__, vector)
 
 
def chunk_rng(rng, size):
    for i in rng[::size]:
        yield range(i, min(i + size, rng.stop))
 
 
if __name__ == '__main__':
    with Pool(POOL_SZ) as pool:
        total = reduce_mul(
            pool.map(
                reduce_mul,
                chunk_rng(range(1, BASE + 1), CHUNK_SZ)
            )
        )
    print(total)

wi34rd
Раз уж вы любитель больших скоростей, то у меня для вас задачка: http://www.spoj.com/problems/TDPRIMES/ мой рекорд 0.21 с. Кстати эту задачу еще никто не решил на D.
Я подумаю. Пока моя адаптация кода из спора о скорости питона:
  
import numpy as np
from numba import vectorize, int32, int64, bool_
import time as time_
 
 
@vectorize(["bool_(int32)", "bool_(int64)"], nopython=True, target='parallel')
def is_prime(n):
    i = 2
    while True:
        if not n % i:
            return False
        i += 1
        if i >= n:
            return True
    return True
 
 
def primes_below_p(n):
    l = []
    primes = is_prime(np.arange(n + 1))
    for j in xrange(9, n + 1):
        if primes[j - 6] and primes[j]:
            l.append((j-6, j))
    return l
 
 
a = int(round(time_.time() * 1000))
primes = primes_below_p(100 * 1000)
b = int(round(time_.time() * 1000))
print(primes)
print("%s mils" % (b-a))

Офлайн

#3 Март 14, 2017 00:38:27

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

wi34rd && Shaman

wi34rd
1. PEP8
2. Явное лучше неявного, ага

 for part in pool.map(product, (range(x, x + number // processes_number) for x in range(1, number - number // processes_number + 2, number // processes_number))):

Если эти недостатки убрать, то код норм.

Отредактировано 4kpt_V (Март 14, 2017 00:39:37)

Офлайн

#4 Март 14, 2017 10:21:38

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

wi34rd && Shaman

А чем код более явный, тем менее он логически неверный.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version