Python

Питон во всем такой медленный? (сравнивал с JavaScript)

Встретил задачку: Подбрасываем монетку 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 !) Или, у питона изначально задача не в том, чтобы быть быстрым?

А какаой вообще язык умеет считать и ходить по таким циклам быстрее всех?
Питон не особо быстрый, потому что у него нет ног
Виталий Одинцов
Виталий Одинцов
74 418
Лучший ответ
JavaScript - один из самых быстрых интерпретируемых языков (Google cделала очень эффективную виртуальную машину), Python - один из самых медленных. Так что всё вполне очевидно.

Хочешь быстрый код - отказывайся от динамических языков и переходи на компилируемые непосредственно в процессорный код языки со статической типизацией.

P.S. Самым быстрым из популярных языков высокого уровня является C (без плюсов).
Правильно. Питон примерно на два порядка медленнее языков типа C, C++. Fortran.Частично это лечится использованием в Питоне библиотек написанных на таких языках подпрограмм.
стоит отметить, что 80% времени выполнения (по крайней мере, в питоне) занимает получение случайных чисел.
так что тут сравниваются не столько скорости языков, сколько реализации датчиков псевдослучайных чисел.
что, конечно, не умаляет того факта, что питон - тот ещё тормоз.
Дизайн языка python - прежде всего заточен не на скорость выполнения скриптов, а для на скорость разработки (написания кода) и удобство его поддержки. На самом деле, при написании хорошего кода довольно сложно упереться в производительность + python позволяет легко интегрироваться с различными C-шными библиотека, так что если даже в какой то степени начнешь упираться в скорость, есть большое кол-во решений как это можно преодолеть, посмотри, к примеру, uvloop
питон медленный в математических операциях в том числе потому что там используется длинная арифметика из коробки. Если нужна производительность в питоне с математическими операциями обычно используют NumPy
ВЧ
Виктоr Чумак
11 032
Доподбрасываешь питона. Задушит тебя нах... й. Всё таки змея)
Непонятно, зачем от случайного получать еще случайное (подбрасывать монетку 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 секунд. Ваш вопрос скорей напоминает банальный троллинг
Андрюха Гордиенко Спасибо) На то я и выложил код - подозревал, что по неопытности какую-то фигню написал)) В питоне совсем не бубу, первый язык - JS. Не троллинг.
Евгений Доманькин Может, еще о производительности компьютера зависит. У меня Ваш код 24 секунды показал.
Питон вообще красава, он самый лучший