[PYTHON] Ich konnte pypy3.6-7.3.1 nicht mit macOS + pyenv installieren, aber ich konnte pypy3.6-7.3.0 installieren. Ich fühlte den Wind von Pypy nach der Monte-Carlo-Methode.

Zusammenfassung

Erstes Symptom: Ich erhalte einen 403-Fehler, wenn ich versuche, pypy mit pyenv zu installieren

Als ich versuchte, pypy3.6-7.3.1 mit pyenv zu installieren, wurde eine Fehlermeldung angezeigt und die Installation schlug fehl.

% 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)

Voraussetzung Umgebung

Ursache

Von der URL der Archivdatei für macOS, auf die pyenv verweist, wird ein 403-Fehler zurückgegeben.

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

Dies liegt daran, dass Bitbucket Mercurial nicht mehr unterstützt und seit dem 8. Juli 2020 nicht mehr auf den Inhalt des Repositorys zugegriffen werden kann. ..

Lösung

Sie können den neuesten Quellcode von pyenv verwenden. Weil das Problem zwei Tage vor dem Schreiben dieses Artikels (20.08.2020) behoben wurde. Siehe Pull-Anfrage unten:

Wenn Sie Pyenv mit Brew installiert haben

Hier erklären wir die Vorgehensweise zum Löschen des von Brew installierten Pyenv und zum Wechsel zur direkten Installationsmethode von GitHub.

Migration der Pyenv-Installationsmethode: von Brew zu GitHub

Stellen Sie zunächst sicher, dass sich das Stammverzeichnis von pyenv in ~ / .pyenv befindet. (Bei der folgenden Prozedur wird davon ausgegangen, dass das Stammverzeichnis in diesem Pfad vorhanden ist.)

% pyenv root
/Users/snjot/.pyenv

Entfernen Sie pyenv aus dem System, indem Sie das Bier deinstallieren.

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

Befolgen Sie danach die unter Basic GitHub Checkout beschriebenen Schritte.

Da jedoch das von der Brew-Version von pyenv erstellte Verzeichnis "~ / .pyenv" erhalten bleibt, kann der Git-Klon nicht wie bisher ausgeführt werden. Fügen Sie daher dem Verfahren "1. Überprüfen Sie pyenv dort, wo es installiert werden soll" einige Ideen hinzu. Sie können Folgendes tun:

--Teil 1. Portierung des Verzeichnisses .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

--Teil 2. Wiederherstellen von Dateien aus .git

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

Siehe Offizielle Verfahren für den Rest.

Schließlich ist es eine gute Idee, sicherzustellen, dass Sie es richtig installiert haben.

% pyenv --version
pyenv 1.2.20-2-gdc4e24e6

Wenn Sie direkt von GitHub installieren

Aktualisieren Sie die Version von pyenv und verwenden Sie die nach dc4e24e.

Aktualisierung gemäß dem offiziellen Verfahren. Als Referenz habe ich den folgenden Befehl gepostet:

cd $(pyenv root)
git pull

Zweites Symptom: 403 Nach Behebung des Fehlers wird ein Build-Fehler angezeigt und ich kann pypy3.6-7.3.1 nicht installieren

Nach der Implementierung der Lösung ist beim Installieren von pypy3.6-7.3.1 der folgende Fehler aufgetreten:

% 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

Nach der Untersuchung stieß ich auf ein ungelöstes Problem und gab die Installation von pypy3.6-7.3.1 auf.

Die vorherige Version, pypy3.6-7.3.0, wurde erfolgreich installiert.

% 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

Ermittlung

Zuerst habe ich die folgende URL gemäß den auf dem Bildschirm ausgegebenen Anweisungen überprüft:

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

Dann wurde bestätigt, ob die Voraussetzungen erfüllt waren. In meinem Fall hat es die Voraussetzungen erfüllt.

Als nächstes habe ich alle unter URL oben beschriebenen Lösungen ausprobiert. Das Problem wurde jedoch nicht gelöst.

Ich habe pypy3.6-7.3.0 mit dem folgenden Befehl installiert, um zu überprüfen, ob es sich um ein spezielles Problem mit pypy3.6-7.3.1 handelt, und es wurde ohne Probleme installiert.

% 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

Ich habe das GitHub-Repository von pyenv überprüft, nach Problemen gesucht und ein ähnliches Problem gefunden:

Ich habe die Installation von pypy3.6-v7.3.1 abgebrochen, da es sich zum Zeitpunkt des Schreibens des Artikels um ein ungelöstes Problem handelt.

Hello, pypy!

Ich konnte pypy3.6-7.3.0 installieren, also habe ich es versucht.

% 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.
>>>>

Es funktioniert richtig: thumbsup:

Bonus: Lassen Sie mich das Umfangsverhältnis berechnen und den Wind von Pypy spüren

Da es eine große Sache ist, habe ich versucht, die Geschwindigkeit des Pypy durch ungefähre Berechnung des Umfangsverhältnisses nach der Monte-Carlo-Methode zu spüren. pypy lief 4,7 mal schneller. Es ist wundervoll.

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)")

Der Code ist unter This GitHub Repository verfügbar.

Einfaches Experiment

Erster Lauf mit Pypy:

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

Führen Sie dann denselben Code in CPython aus:

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

Im Vergleich der Berechnungszeit konnte pypy 4,69-mal schneller als CPython berechnen.

Dies ist ein einfaches Experiment, daher werde ich die Diskussion weglassen.

Jeder, bitte spüren Sie die Geschwindigkeit von Pypy. das ist alles!

Recommended Posts

Ich konnte pypy3.6-7.3.1 nicht mit macOS + pyenv installieren, aber ich konnte pypy3.6-7.3.0 installieren. Ich fühlte den Wind von Pypy nach der Monte-Carlo-Methode.
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Die erste Markov-Ketten-Monte-Carlo-Methode von PyStan
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
Geschwindigkeitsvergleich jeder Sprache nach der Monte-Carlo-Methode
Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.
tkinter konnte nicht mit Python verwendet werden, das von pyenv of anyenv installiert wurde
Schätzung von π nach der Monte-Carlo-Methode
Ich konnte das Python-Modul nicht mit VSCODE importieren, aber ich konnte es auf jupyterlab tun, also suchte ich nach der Ursache (2)