Добрый день.
Все мы знаем что качество и скорость кода зависит от программиста. Хороший программист может умело пользоваться сильными и слабыми сторонами своего ЯП.
В прошлый раз PHP показал свою сильную сторону — числа это числа. В Python числа это объекты.
Значит для объективного теста нужно что бы PHP тоже считал математические объекты.
Я постарался сделать код наиболее похожим друг на друга, что бы соблюдать объективность теста. По-этому не использовал различные хитрые оптимизации которые знаю для Python и не знаю для PHP. В Python есть встроенный класс комплексных чисел, но для объективности теста класс комплексных чисел написан похожим на PHP вариант и с минимальным функционалом.
Получившийся код такой:
В объективных тестах Python быстрее.
Thomas Vander Stichele так же отметил что с помощью решета Эратосфена поиск простых чисел можно многократно ускорить.
PS: Буду благодарен если укажите где код не эквивалентный, только без хитрых оптимизаций.
Привет всем в группе python-django-spb, присоединяйтесь пожалуйста тоже.
Все мы знаем что качество и скорость кода зависит от программиста. Хороший программист может умело пользоваться сильными и слабыми сторонами своего ЯП.
В прошлый раз PHP показал свою сильную сторону — числа это числа. В Python числа это объекты.
Значит для объективного теста нужно что бы PHP тоже считал математические объекты.
Методика тестирования
Хорошими математическими объектами являются комплексные числа, в PHP и в Python комплексные числа будут представлены объектами. За основу я взял тест с наивным поиском простых чисел и код написанный Thomas Vander Stichele, только вместо целых чисел используются действительные числа из комплексного числа. Главное что соблюдается условие что в двух языках используются объекты.Я постарался сделать код наиболее похожим друг на друга, что бы соблюдать объективность теста. По-этому не использовал различные хитрые оптимизации которые знаю для Python и не знаю для PHP. В Python есть встроенный класс комплексных чисел, но для объективности теста класс комплексных чисел написан похожим на PHP вариант и с минимальным функционалом.
Получившийся код такой:
PHP
#!/usr/bin/env php
<?php
class Complex {
public $real = 0;
private $imag = 0;
public function __construct($real, $imag = null) {
$this->real = (float)$real;
}
public function __toString() {
return sprintf("(%d+%dj)", $this->real, $this->imag);
}
}
$start = microtime(TRUE);
$primeNumbers = array();
$output = '';
for ($i = 2; $i < 100000; $i++) {
$divisible = false;
$in = new Complex($i);
foreach($primeNumbers as $number) {
if ($in->real % $number->real == 0) {
$divisible = true;
break;
}
}
if ($divisible == false){
$primeNumbers[] = $in;
$output .= $in;
}
}
echo "time: ", microtime(TRUE) - $start, "\n";
echo count($primeNumbers), " ", strlen($output), "\n";
?>
Python
#!/usr/bin/env python
import time
class Complex(object):
def __init__(self, real, imag=None):
self.real = real
self.imag = 0
def __str__(self):
return "({0}+{1}j)".format(self.real, self.imag)
start = time.time()
primeNumbers = []
output = ""
for i in xrange(2, 100000):
divisible = False
inum = Complex(i)
for number in primeNumbers:
if inum.real % number.real == 0:
divisible = True
break
if divisible == False:
primeNumbers.append(inum)
output += str(inum)
print 'time: %f' % (time.time() - start)
print len(primeNumbers), len(output)
Тестирование
В моей тестовой среде Ubuntu 10.04 работающая в VMWare Player 3 на процессоре Celeron 1.2GHz получилось:- PHP 5 — 50 с;
- Python 2.6 — 30 c.
Вывод
Если Вам нужен простой математический калькулятор — пользуйтесь PHP.В объективных тестах Python быстрее.
Thomas Vander Stichele так же отметил что с помощью решета Эратосфена поиск простых чисел можно многократно ускорить.
PS: Буду благодарен если укажите где код не эквивалентный, только без хитрых оптимизаций.
Привет всем в группе python-django-spb, присоединяйтесь пожалуйста тоже.