[PYTHON] Je n'ai pas pu installer pypy3.6-7.3.1 avec macOS + pyenv, mais je pourrais installer pypy3.6-7.3.0. J'ai senti le vent du pypy par la méthode Monte Carlo.

Résumé

--Lorsque j'essaye d'installer pypy avec pyenv, j'obtiens une erreur 403

Premier symptôme: j'obtiens une erreur 403 lorsque j'essaye d'installer pypy avec pyenv

Lorsque j'ai essayé d'installer pypy3.6-7.3.1 avec pyenv, un message d'erreur s'est affiché et l'installation a échoué.

% pyenv install -v pypy3.6-7.3.1
/var/folders/fv/495qgk712lg73r5dxmr83mhh0000gn/T/python-build.20200822165404.41441 ~/work
Downloading pypy3.6-v7.3.1-osx64.tar.bz2...
-> https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.1-osx64.tar.bz2
curl: (22) The requested URL returned error: 403
error: failed to download pypy3.6-v7.3.1-osx64.tar.bz2

BUILD FAILED (OS X 10.15.6 using 0000000000)

Environnement prérequis

Cause

Une erreur 403 est renvoyée par l'URL du fichier d'archive pour macOS référencé par pyenv.

Downloading pypy3.6-v7.3.1-osx64.tar.bz2...
-> https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.1-osx64.tar.bz2
curl: (22) The requested URL returned error: 403

En effet, Bitbucket ne prend plus en charge Mercurial, le contenu du référentiel est devenu inaccessible depuis le 8 juillet 2020. ..

Solution

Vous pouvez utiliser le dernier code source de pyenv. Car le problème a été résolu deux jours avant la rédaction de cet article (20/08/2020). Voir la demande de tirage ci-dessous:

Si vous avez installé pyenv avec brew

Ici, nous expliquerons la procédure pour supprimer le pyenv installé par brew et passer à la méthode d'installation directe depuis GitHub.

Migration de la méthode d'installation pyenv: de brew à GitHub

Tout d'abord, assurez-vous que le répertoire racine de pyenv est dans ~ / .pyenv. (La procédure suivante suppose que le répertoire racine existe dans ce chemin.)

% pyenv root
/Users/snjot/.pyenv

Supprimez pyenv du système avec la désinstallation de l'infusion.

% brew uninstall pyenv
Uninstalling /usr/local/Cellar/pyenv/1.2.20... (708 files, 2.5MB)

Ensuite, suivez la procédure décrite dans Basic GitHub Checkout.

Cependant, comme le répertoire ~ / .pyenv créé par la version brew de pyenv reste, le clonage git ne peut pas être effectué selon la procédure telle qu'elle est. Par conséquent, ajoutez quelques idées à la procédure "1. Vérifiez pyenv où vous voulez qu'il soit installé." Vous pouvez faire ce qui suit:

--Partie 1. Portage du répertoire .git

% git clone https://github.com/pyenv/pyenv.git ~/.pyenv-temp
Cloning into '/Users/snjot/.pyenv-temp'...
remote: Enumerating objects: 123, done.
remote: Counting objects: 100% (123/123), done.
remote: Compressing objects: 100% (121/121), done.
remote: Total 18256 (delta 106), reused 5 (delta 0), pack-reused 18133
Receiving objects: 100% (18256/18256), 3.65 MiB | 2.80 MiB/s, done.
Resolving deltas: 100% (12440/12440), done.
% mv ~/.pyenv-temp/.git ~/.pyenv/.git
% rm -rf ~/.pyenv-temp

--Partie 2. Restauration de fichiers à partir de .git

% cd ~/.pyenv
% git reset HEAD --hard
HEAD is now at dc4e24e6 Fix PyPy download links (#1682)

Voir Procédures officielles pour le reste.

Enfin, c'est une bonne idée de vous assurer que vous l'avez installé correctement.

% pyenv --version
pyenv 1.2.20-2-gdc4e24e6

Si vous installez directement à partir de GitHub

Mettez à jour la version de pyenv et utilisez celle qui suit dc4e24e.

Mise à jour selon la procédure officielle. Pour référence, j'ai posté la commande ci-dessous:

cd $(pyenv root)
git pull

Deuxième symptôme: 403 J'obtiens une erreur de construction après avoir résolu l'erreur et je ne peux pas installer pypy3.6-7.3.1

Après avoir implémenté la solution, j'ai rencontré l'erreur suivante en essayant d'installer pypy3.6-7.3.1:

% pyenv install pypy3.6-7.3.1
Downloading pypy3.6-v7.3.1-osx64.tar.bz2...
-> https://downloads.python.org/pypy/pypy3.6-v7.3.1-osx64.tar.bz2
Installing pypy3.6-v7.3.1-osx64...
/Users/snjot/.pyenv/plugins/python-build/bin/python-build: line 1590: 44564 Abort trap: 6           "$PYTHON_BIN" -c "import $1" > /dev/null 2>&1
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
/Users/snjot/.pyenv/plugins/python-build/bin/python-build: line 1590: 44565 Abort trap: 6           "$PYTHON_BIN" -c "import $1" > /dev/null 2>&1
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
/Users/snjot/.pyenv/plugins/python-build/bin/python-build: line 1599: 44566 Abort trap: 6           "$PYTHON_BIN" -c "import $1" > /dev/null 2>&1
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems

Après enquête, j'ai trouvé un problème non résolu, j'ai donc abandonné l'installation de pypy3.6-7.3.1.

La version précédente, pypy3.6-7.3.0, a été installée avec succès.

% pyenv install pypy3.6-7.3.0
Downloading pypy3.6-v7.3.0-osx64.tar.bz2...
-> https://downloads.python.org/pypy/pypy3.6-v7.3.0-osx64.tar.bz2
Installing pypy3.6-v7.3.0-osx64...
Installed pypy3.6-v7.3.0-osx64 to /Users/snjot/.pyenv/versions/pypy3.6-7.3.0

enquête

Tout d'abord, j'ai vérifié l'URL suivante selon les instructions affichées à l'écran:

Please consult to the Wiki page to fix the problem. https://github.com/pyenv/pyenv/wiki/Common-build-problems

Ensuite, il a été confirmé si les conditions préalables étaient satisfaites. Dans mon cas, il remplissait les conditions préalables.

Ensuite, j'ai essayé toutes les solutions décrites dans URL ci-dessus. Cependant, le problème n'a pas été résolu.

J'ai installé pypy3.6-7.3.0 avec la commande suivante pour vérifier s'il s'agissait d'un problème spécial avec pypy3.6-7.3.1, et il a été installé sans aucun problème.

% pyenv install pypy3.6-7.3.0
Downloading pypy3.6-v7.3.0-osx64.tar.bz2...
-> https://downloads.python.org/pypy/pypy3.6-v7.3.0-osx64.tar.bz2
Installing pypy3.6-v7.3.0-osx64...
Installed pypy3.6-v7.3.0-osx64 to /Users/snjot/.pyenv/versions/pypy3.6-7.3.0

J'ai vérifié le référentiel GitHub de pyenv et cherché des problèmes et trouvé un problème similaire:

Comme il s'agit d'un problème non résolu au moment de la rédaction de l'article, j'ai abandonné l'installation de pypy3.6-v7.3.1.

Hello, pypy!

J'ai pu installer pypy3.6-7.3.0, alors je l'ai essayé.

% pyenv shell pypy3.6-7.3.0
% python
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 10:50:17)
[PyPy 7.3.0 with GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>

Cela fonctionne correctement: thumbsup:

Bonus: laissez-moi calculer le rapport de circonférence et ressentez le vent

Comme c'est un gros problème, j'ai essayé de sentir la vitesse du pypy en calculant approximativement le rapport de circonférence par la méthode de Monte Carlo. pypy a fonctionné 4,7 fois plus vite. C'est merveilleux.

code

import math
import random
import time
from typing import List, Tuple


def generate_random_point2d() -> Tuple[float, float]:
    return (random.random(), random.random())


def generate_multiple_random_points2d(num_samples: int) -> List[Tuple[float, float]]:
    points = []
    for _ in range(num_samples):
        points.append(generate_random_point2d())
    return points


def calculate_l2norm(point2d: Tuple[float, float]) -> float:
    return math.sqrt(point2d[0] ** 2 + point2d[1] ** 2)


def count_points_within_quadrant(l2norms: List[float]) -> int:
    num_points = 0
    for l in l2norms:
        if l <= 1:
            num_points += 1
    return num_points


def calculate_pi(num_samples: int) -> float:
    points = generate_multiple_random_points2d(num_samples)
    l2norms = [calculate_l2norm(p) for p in points]
    num_points_within_quadrant = count_points_within_quadrant(l2norms)
    pi = 4 * num_points_within_quadrant / num_samples
    return pi


if __name__ == "__main__":
    random.seed(0, version = 2)

    tic = time.time()
    pi = calculate_pi(10_000_000)
    tac = time.time()

    print(f"pi = {pi}; ({tac - tic} sec)")

Le code est disponible sur This GitHub Repository.

Expérience simple

Première course avec pypy:

% python -m pimonte
pi = 3.1413028; (1.8637058734893799 sec)

Ensuite, exécutez le même code dans CPython:

% python -m pimonte
pi = 3.1413028; (8.742990016937256 sec)

En comparant le temps de calcul, pypy a pu calculer 4,69 fois plus vite que CPython.

C'est une expérience simple, je vais donc omettre la discussion.

Tout le monde, sentez la vitesse de pypy. c'est tout!

Recommended Posts

Je n'ai pas pu installer pypy3.6-7.3.1 avec macOS + pyenv, mais je pourrais installer pypy3.6-7.3.0. J'ai senti le vent du pypy par la méthode Monte Carlo.
Trouvez le ratio de la superficie du lac Biwa par la méthode de Monte Carlo
La première méthode de Monte Carlo en chaîne de Markov par PyStan
Calcul de l'itinéraire le plus court selon la méthode de Monte Carlo
Comparaison de vitesse de chaque langue par la méthode de Monte Carlo
Augmentez la vitesse de la méthode Monte Carlo de l'implémentation de découpage Cython.
tkinter n'a pas pu être utilisé avec python installé par pyenv de anyenv
Estimation de π par la méthode de Monte Carlo
Je n'ai pas pu importer le module python avec VSCODE, mais je pouvais le faire sur jupyterlab, j'ai donc recherché la cause (2)