Вот сравнительный тест, показывающий, что использование str.lower
быстрее, чем предложенный метод принятого ответа (libc.strcasecmp
):
#!/usr/bin/env python2.7
import random
import timeit
from ctypes import *
libc = CDLL('libc.dylib') # change to 'libc.so.6' on linux
with open('/usr/share/dict/words', 'r') as wordlist:
words = wordlist.read().splitlines()
random.shuffle(words)
print '%i words in list' % len(words)
setup = 'from __main__ import words, libc; gc.enable()'
stmts = [
('simple sort', 'sorted(words)'),
('sort with key=str.lower', 'sorted(words, key=str.lower)'),
('sort with cmp=libc.strcasecmp', 'sorted(words, cmp=libc.strcasecmp)'),
]
for (comment, stmt) in stmts:
t = timeit.Timer(stmt=stmt, setup=setup)
print '%s: %.2f msec/pass' % (comment, (1000*t.timeit(10)/10))
типичные времена на моей машине:
235886 words in list
simple sort: 483.59 msec/pass
sort with key=str.lower: 1064.70 msec/pass
sort with cmp=libc.strcasecmp: 5487.86 msec/pass
Так, версия с str.lower
не является только самой быстрой безусловно, но также и самой портативной и pythonic всех предлагаемых решений здесь. Я не представил использование памяти, но исходный плакат все еще не привел неопровержимую причину для волнения об этом. Кроме того, кто говорит, что вызов в libc модуль не копирует строк?
нбар: lower()
строковый метод также имеет преимущество того, чтобы быть зависимым от локали. Что-то Вы не будете, вероятно, разбираться при записи собственного "оптимизированного" решения. Несмотря на это, из-за ошибок и недостающих возможностей в Python, этот вид сравнения может дать Вам неправильные результаты в unicode контексте.
Чтобы проверить наличие временной таблицы и удалить ее
IF OBJECT_ID('tempdb..##Table' , 'U') IS NOT NULL
drop TABLE ##Table
посмотрите в этом представлении, существует ли таблица:
[tempdb].[INFORMATION_SCHEMA].[TABLES]
Вы можете определить наличие временной таблицы с помощью
IF OBJECT_ID('tempdb.dbo.##Table', 'U') IS NOT NULL
и, что удивительно для меня, вы можете удалить ее из любое соединение с
DROP TABLE ##Table
Тем не менее, я не могу не думать, что это было бы плохой идеей, поскольку предположительно соединение / пользователь, который его создал, могут все еще использовать его ...