Панды groupby (), agg () - как вернуть результаты без мультииндекса?

Связанный с этим вопрос (посвященный генераторам простых чисел и в том числе эталонам): Ускорение битстронных / битовых операций в Python?

Для быстрой версии python 3 см. код Bruno Astrolino: https://stackoverflow.com/a/46635266/350331

Faster & amp; более чистый код Python с памятью:

def primes(n):
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
    return [2] + [i for i in xrange(3,n,2) if sieve[i]]

или начиная с половины сита

def primes1(n):
    """ Returns  a list of primes < n """
    sieve = [True] * (n/2)
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i/2]:
            sieve[i*i/2::i] = [False] * ((n-i*i-1)/(2*i)+1)
    return [2] + [2*i+1 for i in xrange(1,n/2) if sieve[i]]

Faster & amp; более объемный код с памятью:

import numpy
def primesfrom3to(n):
    """ Returns a array of primes, 3 <= p < n """
    sieve = numpy.ones(n/2, dtype=numpy.bool)
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i/2]:
            sieve[i*i/2::i] = False
    return 2*numpy.nonzero(sieve)[0][1::]+1

- более быстрое изменение, начиная с трети сита:

import numpy
def primesfrom2to(n):
    """ Input n>=6, Returns a array of primes, 2 <= p < n """
    sieve = numpy.ones(n/3 + (n%6==2), dtype=numpy.bool)
    for i in xrange(1,int(n**0.5)/3+1):
        if sieve[i]:
            k=3*i+1|1
            sieve[       k*k/3     ::2*k] = False
            sieve[k*(k-2*(i&1)+4)/3::2*k] = False
    return numpy.r_[2,3,((3*numpy.nonzero(sieve)[0][1:]+1)|1)]

Версия с чистым питоном A (жесткий код) из вышеприведенного кода будет:

def primes2(n):
    """ Input n>=6, Returns a list of primes, 2 <= p < n """
    n, correction = n-n%6+6, 2-(n%6>1)
    sieve = [True] * (n/3)
    for i in xrange(1,int(n**0.5)/3+1):
      if sieve[i]:
        k=3*i+1|1
        sieve[      k*k/3      ::2*k] = [False] * ((n/6-k*k/6-1)/k+1)
        sieve[k*(k-2*(i&1)+4)/3::2*k] = [False] * ((n/6-k*(k-2*(i&1)+4)/6-1)/k+1)
    return [2,3] + [3*i+1|1 for i in xrange(1,n/3-correction) if sieve[i]]

К сожалению, чистый-питон не использует более простой и более быстрый способ выполнения задания Assignment, а вызов len () внутри цикла, как и в [False]*len(sieve[((k*k)/3)::2*k]), тоже медленный. Поэтому мне пришлось импровизировать, чтобы исправить ввод (и избежать большей математики) и сделать некоторую экстремальную (и больную) математическую магию. Лично я считаю, что стыдно, что numpy (который так широко используется) не является частью стандартной библиотеки python (через 2 года после версии python 3 и без совместимости с numpy), и что улучшения в синтаксисе и скорости, похоже, полностью игнорируются разработчиками python.

15
задан smci 16 February 2018 в 05:23
поделиться