Хотя это слишком широко, между тремя подходами существует множество семантических различий:
JOIN
может привести к появлению нескольких строк при наличии нескольких совпадений. NOT IN
отфильтровывает все строки, если любое значение равно NULL
. EXISTS
работает во всех базах данных независимо от условий, включая условия для нескольких столбцов. IN
(исторически и во многих базах данных) работает только на один столбец. Хотя бывают случаи, когда три перекрываются, они не эквивалентны.
reddit исходный код доступен! Вот то, что я нашел для генерации той строки:
def to_base(q, alphabet):
if q < 0: raise ValueError, "must supply a positive integer"
l = len(alphabet)
converted = []
while q != 0:
q, r = divmod(q, l)
converted.insert(0, alphabet[r])
return "".join(converted) or '0'
def to36(q):
return to_base(q, '0123456789abcdefghijklmnopqrstuvwxyz')
и в другом месте, под классом "Ссылки":
@property
def _id36(self):
return to36(self._id)
Это похоже на уникальный идентификатор для потока. Это, скорее всего, используется для нахождения потока в базе данных.
Мало комментария.
Это не достаточно для этого примера, но обычно добавляющий к спискам
a = []
for i in range(NNN): a.append(i)
a.reverse()
действительно более эффективный, чем вставка в голове.
a = []
for i in range(NNN): a.insert(0,i)
.