@ martijn-pieters Я не знаю, имеет ли список в python2 __cmp__
для обработки сопоставления объектов списка или того, как он обрабатывался в python2.
В любом случае, помимо @ Ответ martijn-pieters , я использовал следующий компаратор списка, поэтому, по крайней мере, он не дает разного сортированного вывода, основанного на разном порядке элементов в одном и том же наборе.
@per_type_cmp(list)
def list_cmp(a, b):
for a_item, b_item in zip(a, b):
if a_item == b_item:
continue
return python2_sort_key(a_item) < python2_sort_key(b_item)
return len(a) < len(b)
Итак, присоединившись к нему с оригинальным ответом Martijn:
from numbers import Number
# decorator for type to function mapping special cases
def per_type_cmp(type_):
try:
mapping = per_type_cmp.mapping
except AttributeError:
mapping = per_type_cmp.mapping = {}
def decorator(cmpfunc):
mapping[type_] = cmpfunc
return cmpfunc
return decorator
class python2_sort_key(object):
_unhandled_types = {complex}
def __init__(self, ob):
self._ob = ob
def __lt__(self, other):
_unhandled_types = self._unhandled_types
self, other = self._ob, other._ob # we don't care about the wrapper
# default_3way_compare is used only if direct comparison failed
try:
return self < other
except TypeError:
pass
# hooks to implement special casing for types, dict in Py2 has
# a dedicated __cmp__ method that is gone in Py3 for example.
for type_, special_cmp in per_type_cmp.mapping.items():
if isinstance(self, type_) and isinstance(other, type_):
return special_cmp(self, other)
# explicitly raise again for types that won't sort in Python 2 either
if type(self) in _unhandled_types:
raise TypeError('no ordering relation is defined for {}'.format(
type(self).__name__))
if type(other) in _unhandled_types:
raise TypeError('no ordering relation is defined for {}'.format(
type(other).__name__))
# default_3way_compare from Python 2 as Python code
# same type but no ordering defined, go by id
if type(self) is type(other):
return id(self) < id(other)
# None always comes first
if self is None:
return True
if other is None:
return False
# Sort by typename, but numbers are sorted before other types
self_tname = '' if isinstance(self, Number) else type(self).__name__
other_tname = '' if isinstance(other, Number) else type(other).__name__
if self_tname != other_tname:
return self_tname < other_tname
# same typename, or both numbers, but different type objects, order
# by the id of the type object
return id(type(self)) < id(type(other))
@per_type_cmp(dict)
def dict_cmp(a, b, _s=object()):
if len(a) != len(b):
return len(a) < len(b)
adiff = min((k for k in a if a[k] != b.get(k, _s)), key=python2_sort_key, default=_s)
if adiff is _s:
# All keys in a have a matching value in b, so the dicts are equal
return False
bdiff = min((k for k in b if b[k] != a.get(k, _s)), key=python2_sort_key)
if adiff != bdiff:
return python2_sort_key(adiff) < python2_sort_key(bdiff)
return python2_sort_key(a[adiff]) < python2_sort_key(b[bdiff])
@per_type_cmp(list)
def list_cmp(a, b):
for a_item, b_item in zip(a, b):
if a_item == b_item:
continue
return python2_sort_key(a_item) < python2_sort_key(b_item)
return len(a) < len(b)
PS: У него больше смысла создавать его в качестве комментария, но у меня не было достаточной репутации, чтобы сделать комментарий. Поэтому я создаю это как ответ.
Некоторые более хорошие коммерческие инструменты:
Среда разработки для Windows, который Вы используете, может содержать свои собственные инструменты. Visual Studio, например, позволяет, Вы обнаруживаете и изолируете утечки памяти в Ваших программах
Возможно, CodeSnitch был бы чем-то, что Вы после? http://www.entrek.com/codesnitch.html
Я любил Блок проверки допустимости Памяти от компании, названной Проверкой программного обеспечения.
У меня был шанс использовать Compuware DevPartner Studio в прошлом, и это было действительно хорошо, но это довольно дорого. Более дешевое решение могло быть GlowCode, я просто работал с 5.x версия, и, несмотря на некоторые проблемы в присоединении к процессу я должен был отладить, это работало вполне хорошо.
Посмотрите" Исходные Инструменты тестирования " ссылка на странице QA Testing и Test Tool Resources программного обеспечения для списка подобных инструментов.
я использовал BoundsChecker, DevPartner Studio и Intel V-Tune in прошлое для профилирования. Мне понравилась V-мелодия лучшее; Вы могли эмулировать различные наборы микросхем Intel, и это даст Вам подсказки, как оптимизировать для той платформы.
Pageheap.exe входит в состав средств отладки для Windows. Это бесплатно и в основном пользовательский распределитель / освобождение памяти.
Если вы разрабатываете с помощью Borland / CodeGear / Embarcadero C ++ Builder, вы можете использовать CodeGuard.
Для Visual C ++ попробуйте Visual Leak Detector . Когда я его использовал, он обнаружил утечку памяти из вызова new
и вернул фактическую строку в исходном коде утечки. Последнюю версию можно найти по адресу http://vld.codeplex.com/ .
Check out this question: Is there a good Valgrind substitute for Windows? . Though general substitute for valgrind is asked, it mainly discusses memory leak detectors and not race conditions detections.
I used Insure++ which does excellent job in finding c++ memory leaks/corruptions and many other bugs like uninitialized variables, pointer errors, strings etc., It also does visual "Code coverage" and run time memory usage etc.. which give more confident on your code.. You can try it for trail version..
More or less all Profilers include checking for memory leaks and show you the stack when the memory was allocated.
I can recommend Intels Parallel Inspector. Simple to use and no recompilation needed. The trial version runs for 30 days.
GlowCode and AtromatedQA also include such capabilites. They all offer free trials.
Compuware DevPartner (aka BoundsChecker) in Contrast needs a slowed down "instrumentation" recompile and the application also runs slower when checking for errors. And BoundsChecker can not work with 64 Bit evsrions at all. We gave up on that tool.
Вы можете прочитать, что Mozilla делает в отношении утечек памяти. Одним из инструментов в их наборе инструментов является сборщик мусора Ганса Боэма, используемый в качестве детектора утечек памяти.
Вы можете попробовать пробную версию RuntimeChecker или пробную версию IBM Purify ..
Бесплатным решением будет использование следующего кода в Visual Studio:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Просто напишите это в верхней части всех ваших файлов cpp. This will detect memory leaks of your application whenc stopping debug run and list them in the output window. Double clicking on a memory leaks line will higlight you the line where memory is allocated and never released. This may help you : http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml
Лучший инструмент, который я когда-либо использовал, - это DevPartner BoundsChecker - он платный, но у него есть пробный период.
Я хотел бы перечислить некоторые инструменты, надеюсь, они будут полезны
прочтите эту статью для более подробной информации
Viusual Studio может помочь обнаружить утечки памяти самостоятельно. См. Советы и приемы Microsoft Visual C ++ -> раздел «Утечки памяти». See also this post in SO
Although real tracing is only possible with the Team Edtion of Visual Studio.
В сочетании с Visual Studio я обычно использую Visual Leak Detector или просто _CrtDumpMemoryLeaks (), который является вызовом api win32. В обоих нет ничего необычного, но они делают свою работу.
Почему не использовать Valgrind + Wine для отладки приложения Windows? Видеть http://wiki.winehq.org/wine_and_valgrind
(Chromium использует это для проверки версии Windows для ошибок памяти; см. build.Chromium.org. И посмотрите на экспериментальные или память водопады и ищу вино.)
Там также доктор память, см. dynamorio.org/drmemory.html
Подходит ли Jochen Kalmbach's Memory Leak Detector?
PS: URL последней версии зарыт где-то в ветке комментариев статьи.
Еще один инструмент памяти для вашего списка: Memory Validator .
Не бесплатно, но далеко не так дорого, как Purify или Boundschecker.
LeakDiag, UMDH, App Verifier, DebugDiag - все это полезные инструменты для повышения надежности кода и поиска утечек памяти.
Библиотека Boost Test может обнаруживать утечки памяти.
Если вы не боитесь mingw, вот несколько ссылок (некоторые могут работать с MSVC)... http://betterlogic.com/roger/?p=1140
Definitely Purify! I've used that to analyze some massive code bases (>3,000 kSLOC) and found it to be excellent.
You might like to look at this list at Wikipedia.
By the way, I've found memwatch to be useful. Thanks Johan!
Утилита пользовательского режима кучи дампа (UMDH) работает с операционной системой для анализа распределения кучи Windows для определенного процесса. Это довольно хороший бесплатный инструмент от Microsoft. Здесь находится мини-учебник «Как использовать Umdh.exe для поиска утечек памяти».
Бесплатная утилита DebugDiag поможет найти память и обработать утечки.
Для работы DebugDiag не нужно расширять программу.
Хотя это не самая простая и интуитивно понятная программа! Обязательно найдите в Google учебные пособия и инструкции по его использованию.