Встретил задачку: Подбрасываем монетку 6 раз. Найти вероятность, что из этих 6, только два раза упадет орел. Математическое решение не важно, захотелось грубо прогнать "подбрасывания" через цикл и проверить результаты.
JS:
let sum = 0;
for (let i = 0; i < 100000000; i++) {
let eagle = 0;
for (let j = 0; j < 6; j++) { // 6 раз подкинули монетку
let x = Math.round(Math.random());
if (x) { // упал орел
eagle++
}
}
if (eagle == 2) { // Орлов оказалось два - посчитали.
sum++
}
}
console.log( sum / 100000000 );
____________________
Python:
import random
sum = 0
for i in range(0, 100000000):
eagle = 0
for j in range(0, 6):
x = round( random.uniform(0,1) )
if x:
eagle += 1
if eagle == 2:
sum += 1
print( sum / 100000000 )
_________________
JS стабльно справляется за 20 секунд, а Питон отвечал минут 15 !) Или, у питона изначально задача не в том, чтобы быть быстрым?
А какаой вообще язык умеет считать и ходить по таким циклам быстрее всех?
Python
Питон во всем такой медленный? (сравнивал с JavaScript)
Питон не особо быстрый, потому что у него нет ног
JavaScript - один из самых быстрых интерпретируемых языков (Google cделала очень эффективную виртуальную машину), Python - один из самых медленных. Так что всё вполне очевидно.
Хочешь быстрый код - отказывайся от динамических языков и переходи на компилируемые непосредственно в процессорный код языки со статической типизацией.
P.S. Самым быстрым из популярных языков высокого уровня является C (без плюсов).
Хочешь быстрый код - отказывайся от динамических языков и переходи на компилируемые непосредственно в процессорный код языки со статической типизацией.
P.S. Самым быстрым из популярных языков высокого уровня является C (без плюсов).
Правильно. Питон примерно на два порядка медленнее языков типа C, C++. Fortran.Частично это лечится использованием в Питоне библиотек написанных на таких языках подпрограмм.
стоит отметить, что 80% времени выполнения (по крайней мере, в питоне) занимает получение случайных чисел.
так что тут сравниваются не столько скорости языков, сколько реализации датчиков псевдослучайных чисел.
что, конечно, не умаляет того факта, что питон - тот ещё тормоз.
так что тут сравниваются не столько скорости языков, сколько реализации датчиков псевдослучайных чисел.
что, конечно, не умаляет того факта, что питон - тот ещё тормоз.
Дизайн языка python - прежде всего заточен не на скорость выполнения скриптов, а для на скорость разработки (написания кода) и удобство его поддержки. На самом деле, при написании хорошего кода довольно сложно упереться в производительность + python позволяет легко интегрироваться с различными C-шными библиотека, так что если даже в какой то степени начнешь упираться в скорость, есть большое кол-во решений как это можно преодолеть, посмотри, к примеру, uvloop
питон медленный в математических операциях в том числе потому что там используется длинная арифметика из коробки. Если нужна производительность в питоне с математическими операциями обычно используют NumPy
Доподбрасываешь питона. Задушит тебя нах... й. Всё таки змея)
Непонятно, зачем от случайного получать еще случайное (подбрасывать монетку 6 раз), можно и штаны через голову одевать.
Скорость падает, потому что вы используете генератор range, + в цикле каждый раз вызываете round(random.uniform) - округление плавающих значений до 0, 1. что уже не эффективно
Выполнить в вашем случае стандартный List(range) невозможно т. к упадет с ошибкой "MemoryError" на 100_000_000.
Поэтому чтобы использовать такое число, нужно подключить библиотеку numpy,
и использовать функцию по генерации случайного целого числа
import time
import numpy as np
t1 = time.time() # замеряем время
_count = 100_000_000
_list = np.random.randint(0, 2, _count) # 0.406 sec
eagle = 0
for i in _list:
....if i: eagle += 1
print ("Elapsed time: {:.3f} sec".format(time.time() - t1))
print('eagle/_count', eagle, '/', _count)
# >> Elapsed time: 11.357 sec
# >> eagle/_count 49990730 / 100000000
PS Так что цена вопроса 11 секунд. Ваш вопрос скорей напоминает банальный троллинг
Скорость падает, потому что вы используете генератор range, + в цикле каждый раз вызываете round(random.uniform) - округление плавающих значений до 0, 1. что уже не эффективно
Выполнить в вашем случае стандартный List(range) невозможно т. к упадет с ошибкой "MemoryError" на 100_000_000.
Поэтому чтобы использовать такое число, нужно подключить библиотеку numpy,
и использовать функцию по генерации случайного целого числа
import time
import numpy as np
t1 = time.time() # замеряем время
_count = 100_000_000
_list = np.random.randint(0, 2, _count) # 0.406 sec
eagle = 0
for i in _list:
....if i: eagle += 1
print ("Elapsed time: {:.3f} sec".format(time.time() - t1))
print('eagle/_count', eagle, '/', _count)
# >> Elapsed time: 11.357 sec
# >> eagle/_count 49990730 / 100000000
PS Так что цена вопроса 11 секунд. Ваш вопрос скорей напоминает банальный троллинг
Андрюха Гордиенко
Спасибо) На то я и выложил код - подозревал, что по неопытности какую-то фигню написал)) В питоне совсем не бубу, первый язык - JS. Не троллинг.
Евгений Доманькин
Может, еще о производительности компьютера зависит. У меня Ваш код 24 секунды показал.
Питон вообще красава, он самый лучший
Похожие вопросы
- Почему все хвалят питон и везде он стал очень востребован, если все говорят, что он в десятки раз медленнее?
- Насколько медленен питон по сравнению с другими програмами?
- Что за зверь Питон.
- Вы согласны с мнением, что питон хуже других языков программирования?
- Питон на сириусе. Кинотеатр
- Решить две задачи на питоне. Помогите пожалуйста
- Как сделать так чтобы питон воспринимал число 13, не как 1 и 3?
- Помогите написать антивирус на питоне.
- Как с помощью питона изменить настройки в роутере
- Алгоритмы на Питоне? Не смешите, даже самый отстойный алгоритм на C++ будет быстрее работать более экономного на Питоне.