Переведите алгоритмический C в Python

Непонятно, почему вы ввели ?? "" в этот код. Это кажется бессмысленным (он говорит: «Если я не могу добавить этот количественный тип, добавьте строку, которая не имеет смысла). Я думаю, что вы имеете в виду:« Я просто хочу, чтобы они были добавлены, если они не равны нулю и на самом деле они должны быть, но я не хочу добавлять ! и падать, если я ошибаюсь. "Если это то, что вы имеете в виду, то это то, что вы имеете в виду:

let healthkitTypesToRead = Set<HKObjectType>([
    .quantityType(forIdentifier: .height),
    .quantityType(forIdentifier: .bodyMass),
    .quantityType(forIdentifier: .heartRate),
    .categoryType(forIdentifier: .sleepAnalysis),
    .quantityType(forIdentifier: .bloodPressureDiastolic),
    .quantityType(forIdentifier: .bloodPressureSystolic),
    ].compactMap { [110] }
)

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

let healthkitTypesToRead = Set<HKObjectType>([
    .quantityType(forIdentifier: .height)!,
    .quantityType(forIdentifier: .bodyMass)!,
    .quantityType(forIdentifier: .heartRate)!,
    .categoryType(forIdentifier: .sleepAnalysis)!,
    .quantityType(forIdentifier: .bloodPressureDiastolic)!,
    .quantityType(forIdentifier: .bloodPressureSystolic)!,
    ]
)

Примечание. Я заменил NSSet на Set. Если у вас нет веских причин, вам не следует использовать здесь NSSet.

9
задан Anderson Green 16 November 2013 в 03:56
поделиться

8 ответов

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

Очень намного лучше приблизьтесь, в целом должен действительно сохранить C C, и перенести его в модуль расширения Python (использующий БОЛЬШОЙ ГЛОТОК, Пирекс, Cython или пишущий обертку вручную) или назвать библиотеку C непосредственно с помощью ctypes. Все преимущества (и оборотные стороны) C для того, что уже C или Вы добавляете позже, и все удобство (и оборотные стороны) Python для любого кода в Python.

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

12
ответ дан 4 December 2019 в 11:09
поделиться

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

  • интерпретируйте это в Python (непомерная потеря производительности)
  • переведите это в Python (огромная потеря производительности)
  • переведите это в байт-код Python (большая потеря производительности)

Перевод C к Python непосредственно возможен (и вероятно приводит к более быстрому коду, чем вышеупомянутые подходы), но Вы по существу записали бы бэкенд компилятора C, который является огромной задачей.

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

3
ответ дан 4 December 2019 в 11:09
поделиться

Написать интерпретатор C на чистом Python? ; -)

1
ответ дан 4 December 2019 в 11:09
поделиться

Почему, не сохраняя код C и создавая модуль Python C, который может быть импортирован в рабочую среду Python?

0
ответ дан 4 December 2019 в 11:09
поделиться

Во-первых, я полагал бы, что обертывание существующей библиотеки C с совершенством Pythonic обеспечивает API в форме модуля Python. Я посмотрел бы на большой глоток, ctypes, пирекс, и независимо от того, что там в эти дни. Сама библиотека C осталась бы там неизменной. Сохраняет работу.

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

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

Преобразовывание из более ограниченных, более ручных языков, таких как IDL (ученым языков описания данных нравится использовать, не другой IDL) трудно, требуя ручного и умственного усилия. C? Забудьте это, только когда люди UFO дают нам свои необычные программные инструменты, тысяча лет перед нашим состоянием!

0
ответ дан 4 December 2019 в 11:09
поделиться

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

0
ответ дан 4 December 2019 в 11:09
поделиться

Я был бы personnaly использовать инструмент, чтобы извлечь uml схему из кода C, затем использовать его, чтобы сгенерировать код Python.

От этого squeleton я - запуск для избавлений от uncessary структур C-стиля, и затем я заполнил бы методы кодом Python.

Я думаю, что это был бы более безопасный и все же самый эффективный путь.

0
ответ дан 4 December 2019 в 11:09
поделиться

Можно всегда компилировать код C и загружаться в библиотеках с помощью ctypes в Python.

-1
ответ дан 4 December 2019 в 11:09
поделиться
Другие вопросы по тегам:

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