Simple Python Défi: le plus Rapide XOR au niveau du Bit sur les Tampons de Données

Défi:

Effectuer un XOR au niveau du bit sur l'égalité des deux tampons de taille. Les tampons seront nécessaires pour être le python str type puisque c'est traditionnellement le type de tampons de données en python. De retour de la valeur résultante comme un str. Le faire aussi vite que possible.

Les entrées sont deux 1 mégaoctet (2**20 octets) les chaînes de caractères.

Le défi est de sensiblement battre mon inefficace de l'algorithme à l'aide de python ou de tiers existants modules python (a assoupli les règles: ou créer votre propre module.) Des augmentations marginales sont inutiles.

from os import urandom
from numpy import frombuffer,bitwise_xor,byte

def slow_xor(aa,bb):
    a=frombuffer(aa,dtype=byte)
    b=frombuffer(bb,dtype=byte)
    c=bitwise_xor(a,b)
    r=c.tostring()
    return r

aa=urandom(2**20)
bb=urandom(2**20)

def test_it():
    for x in xrange(1000):
        slow_xor(aa,bb)
  • Il sonne comme le Python n'est peut-être pas le meilleur langage pour tout problème que vous essayez de résoudre.
  • Je peux vous assurer qu'il est. Python me fait maudire le moins.
  • Si vous voulez de la vitesse dans les opérations bit à bit, moins vous allez être le meilleur il est. Vous pouvez faire un XOR sur un tableau en C, en quelques lignes, et il va battre tout Python de mise en œuvre.
  • Avez-vous le code de prise en charge pour faire de ce module?
  • S. Quel est le niveau de l'utilisation de NumPy, à votre avis?
  • Pourquoi n'êtes-vous pas le faire en C, assemblée, ou GPGPU?
  • Je ne peux pas croire que ce n'est pas tout près (Pas une question) s'...
  • S. naïve C mise en œuvre va faire très mal si le compilateur n'est pas auto-vectorisation, comme nous l'avons vu dans plusieurs exemples ici.
  • Il pourrait être utile de vérifier ce que gcc 4.4 lorsque le forçage de la boucle de dérouler et -O3 (qui comprend la vectorisation), ou de la cpi, ou clang pour cette question. L'optimisation d'un "normal" de la boucle à un vectorisé est non triviale si, en raison à la fois des défauts d'alignement et de fuite des éléments (c'est à dire impossible à remplir la dernière 128bits) doivent être traités correctement, et pour les petits tableaux de la surcharge de qui va l'emporter sur les avantages. Optimisations comme l'utilisation de MOVNTDQ au lieu de MOVDQA est encore plus difficile (voire impossible, dans le cas général).
  • Je vais voter pour fermer cette question hors-sujet parce que c'est un codage défi et pas une vraie question.

InformationsquelleAutor user213060 | 2010-01-22