Правильная конкатенация строк CPython - PullRequest
0 голосов
/ 18 августа 2011

Прошлой ночью я был на Boston Python Meetup , где описывались различные реализации Python.Часть обсуждения включала конкатенацию строк.

Очевидно, что для CPython фрагментация кучи меньше, если строки объединяются, начиная с пустой строки, а затем с помощью объединения.

Это нормально для построения строки

sql_statement = "select count(*) " + \
    "from ept_inv e " + \
    "where e.ept_type =  " + str(in_row[cs.DeviceType]) + " " + \
    "and e.inv_id = " + str(in_row[cs.EndpointID]) + " ; "

или я должен был установить sql_statement в "" и затем соединить каждую часть?Спасибо.

Ответы [ 5 ]

3 голосов
/ 18 августа 2011

Вы можете использовать многострочный строковый литерал с .format:

sql_statement_format = """
    select count(*)
    from ept_inv e
    where e.ept_type = {device_type} 
    and e.inv_id = {endpoint_id};
"""
sql_statement = sql_statement_format.format(
    device_type=in_row[cs.DeviceType],
    endpoint_id=in_row[cs.EndpointId])

Вам нужно правильно санировать свои SQL-запросы, или могут случиться плохие вещи . Есть ли причина, по которой вы не используете API базы данных Python?

2 голосов
/ 18 августа 2011

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

Избегайте:

out = "<html>" + head + prologue + query + tail + "</html>"

Вместо этого используйте

out = "<html>%s%s%s%s</html>" % (head, prologue, query, tail)
1 голос
/ 18 августа 2011

Это должно быть быстрее и проще для чтения.Это довольно небольшое количество строк для объединения, поэтому я бы не стал на этом сильно концентрироваться:).

" ".join([
    "select count(*)",
    "from ept_inv e",
    "where e.ept_type =",
    str(in_row[cs.DeviceType]),
    "and e.inv_id =",
    str(in_row[cs.EndpointID]),
    ";"
])
0 голосов
/ 18 августа 2011

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

Также обратите внимание на комментарий . : -)

0 голосов
/ 18 августа 2011

@ Роберт имеет очень хороший смысл использовать format() для строки.Другой способ объединения строк:

s = ('select count(*)'
     'from ept_inv e'
     'where e.ept_type = {device_type}'
     'and e.inv_id = {endpoint_id};')

sql_statement = sql_statement_format.format(
                    device_type=in_row[cs.DeviceType],
                    endpoint_id=in_row[cs.EndpointId])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...