[PYTHON] Cython arrive sur AtCoder !!

Cython arrive sur AtCoder !!

Mise à jour du langage En tant que membre d'équipage, j'ai pu essayer Cython dans le nouvel environnement de test des juges, alors je l'ai essayé. Au fait, quelle est la première fois que j'ai touché Cython? Je ne sais même pas (rires)

À propos, Python 3 après la mise à jour du langage est 3.8.0 et Cython est 0.29.14.

Le code Python fonctionne tel quel

ABC085C - Je l'ai essayé avec Otoshidama. J'ai soumis le code source qui était AC à 678 ms avec Python 3 comme c'est le cas avec Cython et AC à 614 ms.

from sys import exit

N, Y = map(int, input().split())

for i in range(N + 1):
    for j in range(N + 1 - i):
        k = N - i - j
        if 10000 * i + 5000 * j + 1000 * k == Y:
            print('%d %d %d' % (i, j, k))
            exit()
print('-1 -1 -1')

L'erreur de syntaxe est CE au lieu de RE!

Ne pensiez-vous pas que Python 3 serait pénalisé avec RE même si les compilateurs étaient CE et aucune pénalité même avec une faute de frappe bâclée? Cython serait CE.

Si vous essayez de supprimer le = dans la première instruction d'affectation, vous obtiendrez une erreur comme celle-ci.

Error compiling Cython file:
------------------------------------------------------------
...
from sys import exit

N, Y  map(int, input().split())
     ^
------------------------------------------------------------

Main.py:3:6: Syntax error in simple statement list
./Main.c:1:2: error: #error Do not use this file, it is the result of a failed Cython compilation.
    1 | #error Do not use this file, it is the result of a failed Cython compilation.
      |  ^~~~~

C'est rapide à taper!

En regardant la documentation Cython, il semble que j'ai besoin de deux codes sources, comme écrire un fichier .pyx, le compiler, et l'importer et l'utiliser dans .py, donc je ne savais pas comment l'utiliser au début. Cython a le mode Pure Python, qui semble être utilisé par AtCoder.

En conséquence, AC.6 fois plus rapide en 107ms !!

from cython import longlong

def main():
    N: longlong
    Y: longlong
    N, Y = map(int, input().split())

    i: longlong
    j: longlong
    for i in range(N + 1):
        for j in range(N + 1 - i):
            k: longlong = N - i - j
            if 10000 * i + 5000 * j + 1000 * k == Y:
                print('%d %d %d' % (i, j, k))
                return
    print('-1 -1 -1')

if __name__ == '__main__':
    main()

Annexe: avec PyPy 3

Après la mise à jour du langage, PyPy 3 était de 7.3.0 et AC à 150 ms. Cependant, la consommation de mémoire a été considérablement augmentée à 64 Mo par rapport à 8,7 Mo pour Python 3 / Cython.

Recommended Posts

Cython arrive sur AtCoder !!
Introduction à l'écriture de Cython [Notes]
AtCoder Pour devenir bleu clair
Golang est difficile à traduire. .. .. (Partie 1)
Tutoriel Cython: Comment utiliser shared_ptr
Essayez Cython dans les plus brefs délais