День 1 Летней школы Julia 2025
作者
贡献者
using PyCall
# Функция для вычисления n-го числа Фибоначчи (рекурсивная)
function fib_recursive(n)
if n <= 1
return n
else
return fib_recursive(n-1) + fib_recursive(n-2)
end
end
# Функция для вычисления n-го числа Фибоначчи (итеративная)
function fib_iterative(n)
if n <= 1
return BigInt(n)
end
a, b = BigInt(0), BigInt(1)
for i in 2:n
a, b = b, a + b
end
return b
end
# Функция для работы с массивами (сумма квадратов)
function sum_of_squares(arr)
total = 0.0
for x in arr
total += x^2
end
return total
end
# Загрузка Python и определение эквивалентных функций
py"""
import time
import numpy as np
def fib_recursive_py(n):
if n <= 1:
return n
else:
return fib_recursive_py(n-1) + fib_recursive_py(n-2)
def fib_iterative_py(n):
if n <= 1:
return n
a, b = 0, 1
for i in range(2, n+1):
a, b = b, a + b
return b
def sum_of_squares_py(arr):
total = 0.0
for x in arr:
total += x**2
return total
def sum_of_squares_numpy(arr):
return np.sum(arr**2)
"""
# Создаем массивы для тестирования
n_fib = 35 # Для рекурсивного метода используем меньшее значение
n_fib_iter = 1000000
arr_size = 10000000
test_arr = rand(Float64, arr_size)
println("Сравнение производительности Julia vs Python")
println("="^50)
# Тест 1: Рекурсивное вычисление Фибоначчи
println("\n1. Рекурсивное вычисление Fib($n_fib):")
# Julia
@time julia_recursive = fib_recursive(n_fib)
println("Julia результат: ", julia_recursive)
# Python
start_time = time()
python_recursive = py"fib_recursive_py($n_fib)"
python_time1 = time() - start_time
println("Python результат: ", python_recursive)
println("Время Julia: $(@elapsed fib_recursive(n_fib)) секунд")
println("Время Python: $python_time секунд")
# Тест 2: Итеративное вычисление Фибоначчи
println("\n2. Итеративное вычисление Fib($n_fib_iter):")
# Julia
@time julia_iterative = fib_iterative(n_fib_iter)
println("Julia результат: ", julia_iterative % 1000000, " (последние 6 цифр)")
# Python
start_time = time()
python_iterative = py"fib_iterative_py($n_fib_iter)"
python_time2 = time() - start_time
println("Python результат: ", python_iterative % 1000000)
println("Время Julia: $(@elapsed fib_iterative(n_fib_iter)) секунд")
println("Время Python: $python_time секунд")
# Тест 3: Сумма квадратов массива
println("\n3. Сумма квадратов массива из $arr_size элементов:")
# Julia
@time julia_sum = sum_of_squares(test_arr)
println("Julia результат: ", julia_sum)
# Python (чистый Python)
start_time = time()
python_sum = py"sum_of_squares_py($test_arr)"
python_time3 = time() - start_time
println("Python результат: ", python_sum)
println("Время Julia: $(@elapsed sum_of_squares(test_arr)) секунд")
println("Время Python: $python_time секунд")
# Python (numpy)
start_time = time()
python_numpy_sum = py"sum_of_squares_numpy($test_arr)"
python_numpy_time = time() - start_time
println("NumPy результат: ", python_numpy_sum)
println("Время NumPy: $python_numpy_time секунд")
# Сравнение производительности
println("\n" * "="^50)
println("ИТОГИ СРАВНЕНИЯ:")
julia_time_recursive = @elapsed fib_recursive(n_fib)
julia_time_iterative = @elapsed fib_iterative(n_fib_iter)
julia_time_sum = @elapsed sum_of_squares(test_arr)
speedup_recursive = round(python_time1 / julia_time_recursive, digits=1)
speedup_iterative = round(python_time2 / julia_time_iterative, digits=1)
speedup_sum = round(python_time3 / julia_time_sum, digits=1)
speedup_sum_numpy = round(python_numpy_time / julia_time_sum, digits=1)
println("Рекурсивный Fib: Julia $(speedup_recursive)x быстрее")
println("Итеративный Fib: Julia $(speedup_iterative)x быстрее")
println("Сумма квадратов (цикл): Julia $(speedup_sum)x быстрее")
println("Сумма квадратов (NumPy): Julia $(speedup_sum_numpy)x быстрее")