LinkedList на python и c ++ [duplicate]

Как утверждали другие, у вас нет гарантии относительно порядка, когда вы перебираете свойства объекта. Если вам нужен упорядоченный список нескольких полей, я предложил создать массив объектов.

  var myarr = [{somfield1: 'x', somefield2: 'y'}, {somfield1: 'a  ', somefield2:' b '}, {somfield1:' i ', somefield2:' j '}];   

Таким образом, вы можете использовать регулярный цикл и иметь порядок вставки. Затем вы можете использовать метод сортировки массива, чтобы отсортировать его в новом массиве, если это необходимо.

45
задан John Saunders 19 June 2010 в 07:07
поделиться

8 ответов

Python - это язык более высокого уровня, чем C, что означает, что он абстрагирует детали компьютера от вас - управление памятью, указатели и т. д. и позволяет писать программы таким образом, который ближе к тому, как люди думают.

Верно, что код C обычно работает в 10-100 раз быстрее, чем код Python, если вы измеряете только время выполнения. Однако, если вы также включаете время разработки, Python часто бьет C. Для многих проектов время разработки намного более критично, чем производительность времени выполнения.

Внутренняя причина, по которой код Python работает медленнее, заключается в том, что код интерпретируется во время выполнения, а не компилируется в собственный код во время компиляции .

Другие интерпретируемые языки, такие как байт-код Java и байт-код .NET, работают быстрее, чем Python, потому что стандартные дистрибутивы включают компилятор JIT , который компилирует байт-код в собственный код во время выполнения. Причина, по которой CPython не имеет JIT-компилятора, заключается в том, что динамическая природа Python затрудняет ее запись. В работе есть work , чтобы написать более быстрое время выполнения Python, поэтому вы должны ожидать сокращения производительности в будущем, но, вероятно, это будет время до стандартного Python дистрибутив включает мощный JIT-компилятор.

62
ответ дан Mark Byers 17 August 2018 в 09:48
поделиться
  • 1
    Python is скомпилирован. – user 13 June 2010 в 20:17
  • 2
    Чтобы быть педантичным: Python обычно не компилируется в native код во время компиляции. Байт-код Python по-прежнему должен интерпретироваться. – Mark Byers 13 June 2010 в 20:24
  • 3
    Вы действительно не объяснили, почему реализации Python, как правило, так голодны. Вы можете абстрагировать все вышеперечисленное, не затрачивая столько затрат во время выполнения; это чрезвычайно динамичный характер Python, который ест весь процессор: все эти атрибуты lookups / method dispatches складываются и дают даже JIT довольно сложное время - и Python обычно используется без JIT на данный момент. – SamB 13 June 2010 в 21:28
  • 4
    @SamB: теперь я добавил сравнение с другими языками, использующими переводы, для решения вашей задачи. Часть, которую я написал об абстракциях, заключалась не в том, чтобы объяснить, почему Python работает медленнее, а для того, чтобы объяснить, почему это может быть быстрее для программирования. – Mark Byers 13 June 2010 в 22:06
  • 5
    В ретроспективе, я думаю, стоит отметить глобальную блокировку интерпретатора и способ, которым все объекты в Python являются выделенными кучами объектами, даже простым целым числом. Не вдаваясь в конкретные детали реализации, эти типы вещей, помимо абстракций более высокого уровня, могут в значительной степени влиять на производительность. Тем не менее, я по-прежнему считаю, что большинство приложений должно быть написано в основном на языке сценариев, таком как Python. Поскольку Кнут утверждает о преждевременной оптимизации, только небольшие части большинства приложений на самом деле очень критичны. – stinky472 1 February 2012 в 18:15

Сравнение C / C ++ с Python не является хорошим сравнением. Как сравнить гоночный автомобиль F1 с грузовиком.

Удивительно, насколько быстро Python по сравнению с другими аналогами других динамических языков. Хотя методология часто считается ошибочной, посмотрите на «Компьютерная игра Benchmark Game ], чтобы увидеть относительную скорость языка на аналогичных алгоритмах.

Сравнение с Perl, Ruby и C # ярмарка '

3
ответ дан dawg 17 August 2018 в 09:48
поделиться
  • 1
    Я предпочитаю использовать метафору ускорения Lamborghini, чтобы работать в 5 кварталах (небезопасные языки) и уличный автомобиль, соблюдая ограничения скорости (безопасные для памяти языки). :) – L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 13 June 2010 в 20:00
  • 2
    C # - статически типизированный бит, хотя он имеет дополнительные динамические типы. – L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 13 June 2010 в 21:02
  • 3
    C больше похоже на ракетный автомобиль для меня - отлично, если вы хотите идти по прямой линии, и нет ничего, чтобы врезаться в соседние, в противном случае не так много! – SamB 13 June 2010 в 21:17
  • 4
    @drewk - вы, кажется, даже не читали название правильно для этого сайта. – igouy 15 June 2010 в 16:11
  • 5
    @drewk - "часто считается ошибочным" показать некоторые доказательства этой инсинуации. – igouy 15 June 2010 в 16:12

Разница между python и C является обычной разницей между интерпретированным (байт-кодом) и скомпилированным (на родном) языком. Лично я на самом деле не вижу, как python работает медленно, он отлично справляется. Конечно, если вы попытаетесь использовать его за пределами своей сферы, это будет медленнее. Но для этого вы можете написать C-расширения для python, который ставит критические по времени алгоритмы в собственный код, делая это быстрее.

9
ответ дан Femaref 17 August 2018 в 09:48
поделиться
  • 1
    s / это / его. Интерпретированное vs скомпилированное средство ничего с точки зрения оптимизации. JVM и C могут быть интерпретированы или скомпилированы. В обоих случаях могут применяться различные оптимизации (адаптивная оптимизация против времени компиляции + LTO) – L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 13 June 2010 в 19:26
  • 2
    Python скомпилирован. – user 13 June 2010 в 20:17
  • 3
    python компилируется в байт-код, который затем интерпретируется. он также может быть скомпилирован для машинного кода, поэтому по сути, никто из нас не прав. – Femaref 13 June 2010 в 20:29
  • 4
    В дополнение к тому, что это не совсем верно, этот ответ не говорит о реальной проблеме, которую @Longpoke объясняет достаточно хорошо в своем ответе. – SamB 13 June 2010 в 21:15

CPython особенно медленный, потому что у него нет оптимизатора Just in Time (поскольку он является эталонной реализацией и в некоторых случаях выбирает простоту по производительности). Unladen Swallow - это проект, который добавляет JIT в LLVM в CPython и достигает огромных ускорений. Возможно, что Jython и IronPython намного быстрее, чем CPython, а также поддерживаются сильно оптимизированными виртуальными машинами (JVM и .NET CLR).

Одна вещь, которая, возможно, оставит Python медленнее, однако, заключается в том, что это динамически типизируется, и есть тонны поиска для каждого доступа к атрибуту.

Например, вызов f для объекта A приведет к возможным поискам в __dict__, вызовам __getattr__ и т. д. затем, наконец, вызовите __call__ на вызываемом объекте f.

Что касается динамической типизации, существует множество оптимизаций, которые могут быть выполнены, если вы знаете, с какими типами данных вы имеете дело. Например, в Java или C, если у вас есть прямой массив целых чисел, которые вы хотите суммировать, окончательный код сборки может быть таким же простым, как выборка значения в индексе i, добавление его к accumulator, а затем увеличение i.

В Python это очень сложно сделать код оптимальным. Скажем, у вас есть объект подкласса списка, содержащий int s. Прежде чем добавить любой, Python должен вызвать list.__getitem__(i), а затем добавить его в «аккумулятор», вызвав accumulator.__add__(n), а затем повторите. Тонны альтернативных поисков могут произойти здесь, потому что другой поток, возможно, изменил, например, метод __getitem__, dict экземпляра списка или dict класса, между вызовами add или getitem. Даже поиск аккумулятора и списка (и любой переменной, которую вы используете) в локальном пространстве имен вызывает поиск в dict. Эти же накладные расходы применяются при использовании любого пользовательского объекта, хотя для некоторых встроенных типов он несколько смягчается.

Также стоит отметить, что примитивные типы, такие как bigint (int в Python 3, long in Python 2.x), список, набор, dict и т. Д. - это то, что люди много используют в Python. На этих объектах есть тонны встроенных операций, которые уже достаточно оптимизированы. Например, для примера выше вы просто вызываете sum(list) вместо использования аккумулятора и индекса. Приклеиваясь к ним и немного сокращаясь с помощью функции int / float / complex, вы, как правило, не будете иметь проблемы с производительностью, и если вы это сделаете, возможно, есть небольшая временная критическая единица (например, функция дайджест SHA2), которую вы можете просто перейдите в C (или Java-код, в Jython). Дело в том, что при кодировании C или C ++ вы будете тратить много времени на то, что вы можете сделать за несколько секунд / строк кода Python. Я бы сказал, что компромисс всегда стоит того, за исключением случаев, когда вы делаете что-то вроде встроенного или программирования в реальном времени и не можете себе это позволить.

38
ответ дан L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 17 August 2018 в 09:48
поделиться
  • 1
    Разве не разгружается ласточка в настоящее время немного больше памяти? 2009 Q2 [ code.google.com/p/unladen-swallow/wiki/Release2009Q2] результаты говорят, что память увеличилась на 10x и 2009 Q3 [ code.google.com/p/unladen- swallow / wiki / Release2009Q3] говорит, что они снизили его на 930% (не уверен, как интерпретировать это число). Похоже, что более низкая память - это цель, но еще не достигнута. – Brendan Long 13 June 2010 в 22:06
  • 2
    doh, это предложение, которое я написал, даже не имеет смысла. – L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 13 June 2010 в 22:12
  • 3
    «Одна вещь, которая, возможно, оставит Python медленнее, однако, состоит в том, что она динамически типизирована, и есть тонны поиска для каждого доступа к атрибуту. & quot; На самом деле именно здесь JIT в PyPy действительно выигрывает. JIT может заметить, что ваш код делает что-то нецелое и простое, и может оптимизировать некоторые простые машинные инструкции. Таким образом, PyPy теперь намного быстрее, чем CPython, когда вы делаете что-то простое в цикле. – steveha 4 October 2013 в 03:04

Помимо ответов, уже опубликованных, одна вещь - способность pythons изменять вещи во время выполнения, которые вы не можете изменить, например, C. Вы можете добавлять функции-члены в классы по ходу. Кроме того, динамическая природа питонов не позволяет сказать, какие типы параметров будут переданы функции, что в свою очередь упрощает оптимизацию.

RPython кажется способ обойти проблему оптимизации.

Тем не менее, она, вероятно, не будет близка к производительности C для numcrunching и т. п.

2
ответ дан Mattias Nilsson 17 August 2018 в 09:48
поделиться
  • 1
    Почему не должен работать RPython разумно? Не переводит ли он прямо прямо на C? – SamB 13 June 2010 в 21:20
  • 2
    По-видимому, я не держусь в курсе последних событий. Там даже есть эталон, где RPython бьет gcc. Будущее уже здесь :) – Mattias Nilsson 13 June 2010 в 21:45
  • 3
    C не имеет классов. Вы имели в виду c ++? – Roman A. Taycher 25 June 2010 в 05:34

C и C ++ компилируются в собственный код, то есть они запускаются непосредственно на CPU. Python - это интерпретируемый язык, что означает, что написанный вами код Python должен проходить через многие, многие этапы абстракции, прежде чем он станет исполняемым машинным кодом.

1
ответ дан Puppy 17 August 2018 в 09:48
поделиться

Python обычно реализуется как язык сценариев. Это означает, что он проходит через интерпретатор, что означает, что он переводит код «на лету» на машинный язык, а не с исполняемого файла на машинный язык с самого начала. В результате он должен оплачивать стоимость перевода кода в дополнение к его выполнению. Это справедливо даже для CPython, даже если он компилируется в байт-код, который ближе к машинному языку и поэтому может быть переведен быстрее. С Python также появляются некоторые очень полезные функции времени исполнения, такие как динамическая типизация, но такие вещи обычно не могут быть реализованы даже в наиболее эффективных реализациях без больших затрат времени исполнения.

Если вы занимаетесь очень интенсивной работой с процессорами, например, , это не редкость для Python, где-то около 200 раз медленнее, чем C ++. Если вы используете CPython, это время можно сократить вдвое, но оно все равно не так быстро. Со всеми этими лакомствами Runtmie стоит цена. Есть много тестов, чтобы показать это, и здесь особенно хороший. Как признается на первой странице, эталонные показатели ошибочны. Все они представлены пользователями, старающимися изо всех сил писать эффективный код на выбранном им языке, но он дает вам хорошую общую идею.

Я рекомендую вам попробовать смешать эти два вместе, если вас беспокоит эффективность : тогда вы можете получить лучшее из обоих миров. Я в первую очередь программист на C ++, но я думаю, что многие люди склонны кодировать слишком много обычного, высокоуровневого кода на C ++, когда это просто неприятность (время компиляции - всего один пример). Смешивание языка сценариев с эффективным языком, таким как C / C ++, который ближе к металлу, - это действительно способ сбалансировать эффективность (производительность) программиста с эффективностью обработки.

4
ответ дан stinky472 17 August 2018 в 09:48
поделиться
  • 1
    По вашему определению, Java также является языком сценариев? Оба языка имеют какой-то байт-код, который выполняется на виртуальной машине. Единственное отличие заключается в том, что python компилируется «на лету», когда это необходимо, что Java обычно не делает. – Mattias Nilsson 26 June 2010 в 20:59
  • 2
    @Mattias: Нет; в то время как вы правы, что оба используют байт-код, Java компилирует байт-код на собственный машинный язык (либо заранее, либо с помощью JIT-компилятора) перед выполнением. В некоторых случаях байт-код Java является родным машинным языком некоторых микропроцессоров. CPython, с другой стороны, является строгим байтовым интерпретатором . Он делает все, что перевод работает «на лету», поэтому он часто примерно в два раза быстрее, чем другие реализации Python, но все же не так быстро, как Java. – stinky472 27 June 2010 в 01:11
  • 3
    Также CPython не компилируется на лету так сильно, как интерпретировать байт-код «на лету». Типичные реализации собираются повторно переводить один и тот же байт-код снова и снова, например, если у вас есть цикл. Вот почему он по-прежнему считается интерпретатором байт-кода, а не компилятором. CPython делает компилировать .py файлы в .pyc на лету (Python для байт-кода), но это совершенно другая вещь. pyc - это просто код, который проще для интерпретатора читать и переводить, но он по-прежнему интерпретируется. Подход Java является скорее гибридом, а не только из-за байт-кода, но и тем, что он делает с ним. – stinky472 27 June 2010 в 01:18
  • 4
    Хорошо, мы задаемся вопросом, как вы определяете слова. В соответствии с этим java интерпретируется (или есть) java.sun.com/docs/overviews/java/java-overview-1.html Но да, у вас есть точка, когда код python не переводится на собственный машинный код, такой как Java. Если, конечно, вы не используете psyco с CPython, который генерирует машинный код. Или, если вы не используете Java-код, который интерпретируется, что также возможно. Это, конечно, означает, что вы не можете сказать что-то о конкретном языке, не указав также, как выполняется программа. – Mattias Nilsson 27 June 2010 в 22:25
  • 5
    Это правда, но также нет ничего, что помешало бы людям выполнять C-код через интерпретатор, и в этом случае кто-то мог бы сказать, что C - интерпретируемый язык. Для практических целей мы описываем языки как интерпретируемые или не основанные на типичных реализациях. С точки зрения строгого языка, языки не интерпретируются и не компилируются. – stinky472 28 June 2010 в 11:52

Компиляция и интерпретация здесь не важны: Python - скомпилирован, и это крошечная часть затрат времени исполнения для любой нетривиальной программы.

Основные затраты : отсутствие целочисленного типа, который соответствует нативным целым числам (делая все целые операции значительно более дорогими), отсутствие статической типизации (что затрудняет разрешение методов и означает, что типы значений должны проверяться во время выполнения) и отсутствие ненужных значений (которые уменьшают использование памяти и могут избежать уровня косвенности).

Не то, чтобы любая из этих вещей была невозможна или не может быть более эффективной в Python, но выбор был сделан в пользу удобства и гибкости программиста, а также чистоты языка во время выполнения. Некоторые из этих затрат могут быть преодолены с помощью умной компиляции JIT, но преимущества, предоставляемые Python, всегда будут иметь определенную стоимость.

9
ответ дан user 17 August 2018 в 09:48
поделиться
  • 1
    Лучший ответ, чем принятый, хотя важно отметить, что python не всегда скомпилирован. Это действительно реализация. В моем опыте это чаще всего интерпретируется. – Triforcey 11 April 2017 в 17:19
Другие вопросы по тегам:

Похожие вопросы: