Дважды. TryParse или Преобразовывают. ToDouble - который быстрее и более безопасен?

Без замены это может быть записано непосредственно в более Pythonic понимании:

output = [[dv, f2, dk] for f1, f2 in f for dk, dv in d.items() if dv == f1]

На простом английском языке: создать список, состоящий из списков dv, f2, dk, где f2 является вторым значением кортежи (f1, f2) в f и где dk и dv являются ключом и значением элементов dk: dv из d, когда значение dv совпадает со значением f1.

Или как полностью функциональный скрипт:

f = [('str1', 7.0), ('str2', 2.8), ('str3', 11.2)]

d = {'aa': 'str2', 'bb': 'str3', 'cc': 'str1'}

desired_output = [['str1', 7.0, 'cc'], ['str2', 2.8, 'aa'], ['str3', 11.2, 'bb']]

output = [[dv, f2, dk] for f1, f2 in f for dk, dv in d.items() if dv == f1]

print(output == desired_output)
79
задан participant 9 October 2014 в 07:26
поделиться

8 ответов

Я сделал быстрый ненаучный тест в режиме Release. Я использовал два исходных данные: "2.34523" и "badinput" в оба метода и выполненный с помощью итераций 1,000,000 раз.

Допустимый вход:

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

Не очень отличающийся, как ожидалось. Во всех отношениях, для допустимого входа, это то же.

Недопустимый вход:

Double.TryParse = 612ms
Convert.ToDouble = ..

Хорошо.. это работало в течение долгого времени. Я повторно выполнил всю вещь с помощью 1 000 повторений, и Convert.ToDouble с плохим входом занял 8,3 секунд. Составляя в среднем его, он принял бы 2 часа. Я не забочусь, насколько основной тест в недопустимом входном случае, Convert.ToDouble, исключение, повышающее, разрушит Вашу производительность.

Так, вот другое голосование за TryParse с некоторыми числами для поддержки его.

129
ответ дан Jamie Rees 24 November 2019 в 10:06
поделиться

Прежде всего, я использовал бы double.Parse, а не Convert.ToDouble во-первых.

относительно того, необходимо ли использовать Parse или TryParse: можно ли продолжить двигаться, если существуют плохие входные данные, или это - действительно исключительное условие? Если это исключительно, используйте Parse и позвольте ему аварийно завершиться, если вход плох. Если это ожидается и может быть чисто обработано, используйте TryParse.

46
ответ дан Jon Skeet 24 November 2019 в 10:06
поделиться

Руководство по проектированию Платформы.NET рекомендует использовать методы Попытки. Предотвращение исключений обычно является хорошей идеей.

Convert.ToDouble(object) сделает ((IConvertible) object).ToDouble(null);

, Который будет звонить Convert.ToDouble(string, null)

, Таким образом, это будет быстрее для вызова строковой версии.

Однако строковая версия просто делает это:

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

, Таким образом, это быстрее, чтобы сделать double.Parse непосредственно.

8
ответ дан Jamie Rees 24 November 2019 в 10:06
поделиться

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

Мой совет, поэтому, никогда не состоит в том, чтобы использовать этот класс. Это не действительно необходимо ни один (за исключением двоичного форматирования числа, потому что нормальное ToString метод классов числа не предлагает соответствующий метод, чтобы сделать это).

7
ответ дан Konrad Rudolph 24 November 2019 в 10:06
поделиться

Если Вы не собираетесь быть обрабатывающим исключения, идут с TryParse. TryParse быстрее, потому что он не должен иметь дело с целым отслеживанием стека исключительной ситуации.

7
ответ дан Aaron Palmer 24 November 2019 в 10:06
поделиться

Я всегда предпочитал использовать TryParse() методы, потому что это собирается плюнуть назад успешностью или неуспешностью для преобразования, не имея необходимость волноваться об исключениях.

2
ответ дан TheTXI 24 November 2019 в 10:06
поделиться

Дважды. TryParse IMO.

для Вас легче обработать, Вы будете знать точно, где ошибка произошла.

Тогда можно иметь дело с ним, как Вы считаете целесообразным, возвращает ли это false (т.е. не мог бы преобразовать).

2
ответ дан Damien 24 November 2019 в 10:06
поделиться

Лично, я нахожу TryParse метод легче читать, какой, который Вы на самом деле захотите использовать, зависит от Вашего примера использования: если ошибки могут быть обработаны локально, Вы ожидаете ошибки, и bool от TryParse хорош, еще Вы могли бы хотеть просто позволить исключениям полететь.

я ожидал бы TryParse быть быстрее также, так как это избегает издержек обработки исключений. Но используйте инструмент сравнительного теста, как MiniBench Jon Skeet для сравнения различных возможностей.

1
ответ дан David Schmitt 24 November 2019 в 10:06
поделиться
Другие вопросы по тегам:

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