advanced-python-homework-2023/interpreters
2023-10-06 14:18:24 +03:00
..
results hw2 interpreters 2023-10-06 13:14:14 +03:00
.gitignore hw2 interpreters 2023-10-06 13:14:14 +03:00
linspace.py hw2 interpreters 2023-10-06 13:14:14 +03:00
np_extended.py hw2 interpreters 2023-10-06 13:14:14 +03:00
pure_no_types.py hw2 interpreters 2023-10-06 13:14:14 +03:00
pure_with_types.py hw2 interpreters 2023-10-06 13:14:14 +03:00
README.md fix interpreters readme 2023-10-06 14:18:24 +03:00
table.png hw2 interpreters 2023-10-06 13:14:14 +03:00
test_full_no_types.py hw2 interpreters 2023-10-06 13:14:14 +03:00
test_full_np.py hw2 interpreters 2023-10-06 13:14:14 +03:00
test_full_with_types.py hw2 interpreters 2023-10-06 13:14:14 +03:00
test_full.sh hw2 interpreters 2023-10-06 13:14:14 +03:00
test.py hw2 interpreters 2023-10-06 13:14:14 +03:00

Interpreters

Tested interpreters

  • CPython 3.9
  • CPython 3.11
  • PyPy 3.9

Table of evaluation times in seconds

enter image description here

Testing Code

Three realisations of mandelbrot functions tested:

def linspace(start, stop, n):
    if n == 1:
        yield stop
        return
    h = (stop - start) / (n - 1)
    for i in range(n):
        yield start + h * i

def mandelbrot_with_types(
    pmin: float = -2.5,
    pmax: float = 1.5,
    qmin: float = -2,
    qmax: float = 2,
    ppoints: int = 200,
    qpoints: int = 200,
    max_iterations: int = 300,
    infinity_border: float = 100) -> list[list[int]]:

    image: list[list[int]] = [[0 for i in range(qpoints)] for j in range(ppoints)]
    for ip, p in enumerate(linspace(pmin, pmax, ppoints)):
        for iq, q in enumerate(linspace(qmin, qmax, qpoints)):
            c: complex = p + 1j * q
            z: complex  = 0
            for k in range(max_iterations):
                z = z ** 2 + c
                if abs(z) > infinity_border:
                    image[ip][iq] = 1
                    break
    return image

def mandelbrot_no_types(
    pmin=-2.5,
    pmax=1.5,
    qmin=-2,
    qmax=2,
    ppoints=200,
    qpoints=200,
    max_iterations=300,
    infinity_border=100):
    image = [[0 for i in range(qpoints)] for j in range(ppoints)]
    for ip, p in enumerate(linspace(pmin, pmax, ppoints)):
        for iq, q in enumerate(linspace(qmin, qmax, qpoints)):
            c = p + 1j * q
            z = 0
            for k in range(max_iterations):
                z = z ** 2 + c
                if abs(z) > infinity_border:
                    image[ip][iq] = 1
                    break
    return image

def mandelbrot_np(
    pmin=-2.5,
    pmax=1.5,
    qmin=-2,
    qmax=2,
    ppoints=200,
    qpoints=200,
    max_iterations=300,
    infinity_border=100):
    image = np.zeros((ppoints, qpoints))

    for ip, p in enumerate(np.linspace(pmin, pmax, ppoints)):
        for iq, q in enumerate(np.linspace(qmin, qmax, qpoints)):
            c = p + 1j * q
            z = 0
            for k in range(max_iterations):
                z = z ** 2 + c
                if abs(z) > infinity_border:

                    image[ip, iq] = 1
                    break
    return image