Глобальная Временная таблица удаляет операцию

Вот сравнительный тест, показывающий, что использование 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 контексте.

7
задан OMG Ponies 16 October 2009 в 17:39
поделиться

3 ответа

Чтобы проверить наличие временной таблицы и удалить ее

IF OBJECT_ID('tempdb..##Table' , 'U') IS NOT NULL
   drop TABLE ##Table
19
ответ дан 6 December 2019 в 07:27
поделиться

посмотрите в этом представлении, существует ли таблица:

[tempdb].[INFORMATION_SCHEMA].[TABLES]
0
ответ дан 6 December 2019 в 07:27
поделиться

Вы можете определить наличие временной таблицы с помощью

IF OBJECT_ID('tempdb.dbo.##Table', 'U') IS NOT NULL

и, что удивительно для меня, вы можете удалить ее из любое соединение с

DROP TABLE ##Table

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

5
ответ дан 6 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

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