AtCoder ABC151 Problème D Comparaison de la vitesse en C ++ / Python / PyPy

Aperçu

Participation à AtCoder ABC151. Résolvez le problème D en C ++ / Python3 / PyPy3 avec une méthode qui n'est probablement pas optimale pour ce problème ([Méthode Warshall-Floyd](https://ja.wikipedia.org/wiki/Warshall-Floyd Method)) J'ai mesuré et comparé.

Le résultat était que C ++ était plus stable et 60 à 70 fois plus rapide lorsque la taille du problème augmentait dans une certaine mesure. Si vous avez des inquiétudes concernant TLE, il semble préférable d'arrêter de soumettre ~~ Implement ~~ en Python.

Plus tard, quand j'ai reçu un commentaire et l'ai soumis avec PyPy3 (2.4.0), j'ai trouvé que TLE était résolu. Cependant, le temps d'exécution était de 1191 ms, ce qui était considérablement plus lent que celui des 71 ms de C ++.

Donc, si vous êtes inquiet pour TLE, il semble préférable de 1. Soumettre l'implémentation en C ++ 2. Implémenter en Python PyPy.

Contexte

Participé à AtCode ABC151. Quand j'ai vu le problème D, j'ai pensé comme suit.

"Il peut être résolu par la méthode (méthode Warshall-Floyd) sur le livre des fourmis. Mais les nœuds (masse) sont connectés uniquement en haut, en bas, à gauche et à droite, et la distance entre les nœuds adjacents est toujours de 1, il existe donc une méthode plus efficace. alors.

Mais O (N ^ 3) et N = 400, donc 400 ^ 3 = 64 000 000, n'est-ce pas? Il est difficile de penser à d'autres méthodes, et je sais que cela résoudra le problème, alors utilisons la méthode Worshall-Floyd. "

Implémenté en Python sans trop réfléchir. J'ai débogué jusqu'à la limite de temps (il y a 3 minutes) et soumis # 9476488 (20-01-12 22:37:01), mais le résultat Est-ce que TLE. J'étais triste.

Plus tard, quand je l'ai implémenté en C ++ et soumis # 9484896, le temps d'exécution était de 71 ms, ce qui était une marge. Je veux y faire référence à l'avenir.

1/15 post-scriptum

Dans le commentaire, "Je n'ai pas eu TLE quand je l'ai sorti avec PyPy 3. J'ai eu 3 WA." Certes, quand je l'ai implémenté avec PyPy, TLE a disparu et WA est sorti de ce qui n'était pas TLE. WA est devenu AC après avoir changé INF en 10 ** 3. (Soumission # 9513468) Cependant, le temps d'exécution était de 1191 ms, ce qui n'était pas TLE, mais il y avait une grande différence par rapport à 71 ms de C ++.

En réponse à ce qui précède, j'ai remesuré la vitesse avec Python / PyPy avec INF = 10 ** 3 sur ma machine.

Résultat de la comparaison de vitesse

** Rapport de vitesse **

image.png

(Axe vertical étendu) image.png

La figure ci-dessus est

C'est le résultat obtenu par.

C ++: En Python, le code Python est INF = 100. (Si vous soumettez ce code à AtCoder avec PyPy3, vous obtiendrez WA) En C ++: Python (# 2) et C ++: PyPy, le code Python est INF = 1000.

myoden@ubuntu002:~/AtCoder/ABC151/D$ pypy3 -V 
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 10:50:04)
[PyPy 7.3.0 with GCC 7.3.1 20180303 (Red Hat 7.3.1-5)]
myoden@ubuntu002:~/AtCoder/ABC151/D$`

Le cas problématique utilisé sera décrit plus loin.

** Temps d'exécution écoulé ** Temps d'exécution écoulé C ++ image.png

Temps d'exécution écoulé Python (INF = 100) image.png

Temps d'exécution écoulé PyPy (INF = 1000) image.png

Le graphique montre la valeur maximale (MAX), la valeur moyenne (AV) et la valeur minimale (MIN) du temps écoulé lorsqu'il a été effectué 5 fois.

Exemple de cas (référence)

Le cas d'échantillon où la taille du problème a été modifiée a été créé en changeant H (= W) de 1 à 20 avec H = W comme suit.

sampleSquare-10.in


myoden@ubuntu002:~/AtCoder/ABC151/D$ cat sampleSquare-10.in 
10 10
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........

sampleSquare-20.in


myoden@ubuntu002:~/AtCoder/ABC151/D$ cat sampleSquare-20.in 
20 20
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
myoden@ubuntu002:~/AtCoder/ABC151/D$ 

Recommended Posts

AtCoder ABC151 Problème D Comparaison de la vitesse en C ++ / Python / PyPy
ABC166 en Python A ~ C problème
Défiez AtCoder (ABC) 164 avec Python! Un problème ~ C
Comparaison de vitesse de Python, Java, C ++
Atcoder ABC164 A-C en Python
Atcoder ABC167 A-D en Python
Résoudre ABC175 D en Python
Atcoder ABC165 A-D en Python
Atcoder ABC166 A-E en Python
AtCoder ABC 182 Python (A ~ D)
Atcoder ABC169 A-E en Python
AtCoder ABC177 A-D avec python
Résoudre Atcoder ABC176 (A, B, C, E) en Python
AtCoder ABC155 Problème D Pairs Review Note 2 NumPy et Python
Résoudre Atcoder ABC169 A-D avec Python
Résoudre ABC036 A ~ C avec Python
Résolu AtCoder ABC 114 C-755 avec Python3
Résoudre ABC037 A ~ C avec Python
AtCoder Beginner Contest 174 C Problème (Python)
[Commentaire d'AtCoder] Gagnez le problème ABC165 C "Many Requirements" avec Python!
Résolution en Ruby, Python et Java AtCoder ABC141 D Priority Queue
Résoudre ABC175 A, B, C avec Python
ABC 157 D - Résolvez les suggestions d'amis en Python!
Algorithme en Python (ABC 146 C Dichotomy
Mémo Atcoder débutant Python @ Keyence 2020, problème ABC
[AtCoder] Résoudre ABC1 ~ 100 Un problème avec Python
AtCoder ABC155 Problème D Pairs Review Note 1
Résoudre AtCoder ABC168 avec python (A ~ D)
Résoudre ABC165 A, B, D avec Python
AtCoder ABC 174 Python
AtCoder ABC 175 Python
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
[Explication AtCoder] Contrôlez les problèmes A, B, (C), D de ABC165 avec Python!
[Explication AtCoder] Contrôlez les problèmes A, B, C, D d'ABC183 avec Python!
[Explication AtCoder] Contrôlez les problèmes A, B, C, D d'ABC181 avec Python!
AtCoder # 36 quotidien avec Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Daily AtCoder # 53 en Python
Daily AtCoder # 33 en Python
AtCoder # 7 tous les jours avec Python
Daily AtCoder # 37 en Python
AtCoder # 8 tous les jours avec Python
AtCoder # 21 quotidien avec Python
Daily AtCoder # 38 en Python
Daily AtCoder # 11 en Python
Daily AtCoder # 15 en Python
Daily AtCoder # 47 avec Python
Daily AtCoder # 13 en Python
AtCoder # 45 quotidien avec Python
AtCoder # 30 tous les jours en Python
AtCoder # 10 quotidien avec Python
Next Python en langage C
Daily AtCoder # 28 en Python
Daily AtCoder # 20 en Python