Обсуждение решений и реализаций на разных языках, сравнение, нахождение лучшего.
Сообщение отредактировал asr: 22.08.2012, 12:32:47
в предыдущем решении формируется общий список, что при пострениие html таблицы совершенно не требуется. без него получается короче и эффективнеетак ведь предыдущее ваше решение справляется с этим ,на сколько эффективно я не знаю пусть питонщики скажут)
зато начинает рождаться астрономическое кол-во туплов, которые нивелируют все теоретические плюсы предложенного решения (даже по скорости). и запаса на оптимизацию у данного решения несоизмеримо меньше чем у моегоПодобную задачу гораздо лучше ( на питоне если ) решить так - http://ideone.com/POXo2
Не нужны ни промежуточные списки ни рекурсия.
Сообщение отредактировал tobber: 24.08.2012, 23:03:42
Сообщение отредактировал tobber: 24.08.2012, 23:10:43
Понятия не имею что за сферических коней меряет github, но визуально и на ideone рекурсивный метод работает заметно быстрее тупельного.Работает на порядок быстрее, код стал даже проще.
это все хорошо в теории. а на практике бывает очень по разному.Работая с Python никогда нельзя забывать, что C код всегда быстрее...
вообщето задача была реализовать алгоритм, а не показать виртуозное жонглирование itertools.Один из главных ключей к быстрым программам на Python - знать когда и где можно передать задачу C'шным библиотекам.
Сообщение отредактировал itty: 24.08.2012, 23:32:10
Понятия не имею что за сферических коней меряет github, но визуально и на ideone рекурсивный метод работает заметно быстрее тупельного.
http://ideone.com/SIcZU
это все хорошо в теории. а на практике бывает очень по разному.
вообщето задача была реализовать алгоритм, а не показать виртуозное жонглирование itertools.
Ключевое слово "эквивалентный". Наш код совершенно разный. Создание и разрушение туплов достаточно дорогая операция по сравнению с рекурсивным вызовом.Да нет, эквивалентный С код _всегда_ быстрее питона.
Просто видимо в itertools.product внутри не тупо рекурсивный итератор как я думал, и как сделан ваш вариант.
Это не плохо и даже весьма правильно, если стоит не образовательная (к чему данный топик ближе) задача .Там из itertools используется только product, который просто вроде бы создан для того чтобы быть использованным в данной задаче.
Каюсь, есть привычка в первую очередь использовать библиотеки для любого чиха, но разве это плохо?
In [11]: def void(): pass In [12]: %timeit void() 10000000 loops, best of 3: 121 ns per loop In [13]: %timeit (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 10000000 loops, best of 3: 27.6 ns per loop
In [5]: %timeit for i in itertools.product(range(10), range(10), range(10)): pass 10000 loops, best of 3: 59.3 us per loop In [6]: def product(head, *tail): ...: for item in head: ...: yield item ...: if tail: ...: for item in product(*tail): ...: yield item ...: In [7]: %timeit for i in product(range(10), range(10), range(10)): pass 100000 loops, best of 3: 6.51 us per loop
Потому как законы природы нарушить сложно, даже в питонеКод действительно разный, но дело вовсе не в туплах как таковых, что вы к ним привязались.
(*) Это конечно хорошо. Просто замечательно. Но опять в теории. А на практикеНакладные расходы на вызов функций намного больше, не говоря уже о том что туплы там создаются в C коде.
In [11]: def void(): pass In [12]: %timeit void() 10000000 loops, best of 3: 121 ns per loop In [13]: %timeit (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 10000000 loops, best of 3: 27.6 ns per loop^ создание тупла из 10-ти элементов и его удаление намного быстрее простого вызова функции.
Я не говорил, что мой код быстрее в 10 раз из-за туплов. Я неверно интерпретировал показания профайлера, мы с этим вроде уже разобрались.итого вместо 10-ти кратного ускорения от использования туплов в теории, в реальности имеем 40...400% проседание производительности
Сообщение отредактировал tobber: 28.08.2012, 19:10:14
Сообщение отредактировал tobber: 28.08.2012, 19:21:27
вот в нете на жаве такое решения нашелзадача отсортировать вот такой список List<String[]>
String[] в купе со всеми элемантами этого массива такая запись уникальна по отдельности нет .
ордер как сиквеле надо сделать на этом списке.
class MyClassComparator implements Comparator<String[]> { private String fillUpLeftWithZeros(String val, int digit) { if (digit == val.length()) { return val; } String res = ""; for (int i = 1; i < digit; i++) { res += "0"; } return res + val; } @Override public int compare(String[] t1, String[] t2) { String char1 = ""; String char2 = ""; int l = 0; for (int i = 0; i < t1.length; i++) { l = Math.max(t1[i].length(), t2[i].length()); char1 += fillUpLeftWithZeros(t1[i], l); char2 += fillUpLeftWithZeros(t2[i], l); } return char1.compareTo(char2); } }
Сообщение отредактировал smug: 29.10.2012, 14:51:49
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0
Размещение рекламы на сайте Предложения о сотрудничестве Служба поддержки пользователей
© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.