Après je réussir peu par écrit un module minimalistic d'extension Python3.6 en C++ (see here) Je prévois de fournir un module Python qui fait la même chose que la fonction Python suivante iterUniqueCombos()
:Comment écrire du code C (d'un module Python) capable de renvoyer un objet Python itérateur?
def iterUniqueCombos(lstOfSortableItems, sizeOfCombo):
lstOfSortedItems = sorted(lstOfSortableItems)
sizeOfList = len(lstOfSortedItems)
lstComboCandidate = []
def idxNextUnique(idxItemOfList):
idxNextUniqueCandidate = idxItemOfList + 1
while (
idxNextUniqueCandidate < sizeOfList
and
lstOfSortedItems[idxNextUniqueCandidate] == lstOfSortedItems[idxItemOfList]
): # while
idxNextUniqueCandidate += 1
idxNextUnique = idxNextUniqueCandidate
return idxNextUnique
def combinate(idxItemOfList):
if len(lstComboCandidate) == sizeOfCombo:
yield tuple(lstComboCandidate)
elif sizeOfList - idxItemOfList >= sizeOfCombo - len(lstComboCandidate):
lstComboCandidate.append(lstOfSortedItems[idxItemOfList])
yield from combinate(idxItemOfList + 1)
lstComboCandidate.pop()
yield from combinate(idxNextUnique(idxItemOfList))
yield from combinate(0)
J'ai quelques base compréhension de la programmation Python et C++, mais absolument aucune idée de la façon de "traduire" Pythons céder dans le code C++ d'un module d'extension Python. Donc, ma question est:
How to write C++ code (of a Python module) able to return a Python iterator object?
Toutes les astuces pour me lancer sont les bienvenues.
MISE À JOUR (état 07.05.2017):
deux le commentaire: rendement n'a pas C++ équivalent. Je commencerais par implémenter le protocole itérateur manuellement en Python, pour sortir du rendement et du rendement de l'état d'esprit. - user2357112 Avr 26 à 1:16 et l'indice dans la réponse par danny
la réponse à cette question revient à demander 'Comment implémenter un itérateur sans utiliser yield' mais dans une extension C++ au lieu du pur Python. mettre mes efforts de programmation dans la mauvaise direction de réinventer la roue en réécrivant le code des algorithmes afin d'éliminer yield
et en écrivant le code C d'un module d'extension Python à partir de zéro (ce qui a entraîné pleut Segmentation Fault
erreurs).
The state-of-the-art of my current knowledge on the subject of the question is that using Cython it is possible to translate the above Python code (which is using
yield
) directly into C code of a Python extension module.
Ceci est non seulement possible en utilisant le code Python comme il est (sans qu'il soit nécessaire de tout réécrire), mais en plus que la vitesse du module d'extension créée par Cython de l'algorithme en utilisant yield
fonctionne à au moins deux fois plus vite que le module d'extension créé à partir d'une classe itérative utilisant __iter__
et __next__
algorithme réécrit (ce dernier est valide si aucun code d'optimisation de vitesse spécifique à Cython n'est ajouté au script Python).
Je commencerai par [implémenter le protocole itérateur manuellement] (https: //www.python.org/dev/peps/pep-0234 /) en Python, pour sortir de l'état d'esprit 'yield' et' yield from'. – user2357112