ConcurrentLinkedHashMap трудно создать, из-за требований блокировки. LinkedHashMap с блокировкой прост, но не всегда производителен. Параллельная версия попыталась бы уменьшить объем блокировки, или разделением блокировки или идеально созданием операций CAS для создания блокировки очень дешевой. Если операции CAS когда-нибудь становятся дорогими, то так же разделение блока может быть полезным. Поскольку LRU требует записей для каждой операции доступа и использует двунаправленный связанный список, это очень хитро для реализации с чистыми операциями CAS. Я делал попытку его, но я должен продолжить становиться зрелым свой алгоритм. При поиске ConcurrentLinkedHashMap Вы будете видеть мою страницу проекта...
, Если бы ME Java не поддерживает операции CAS, которые я ожидал бы быть верным, тогда основная синхронизация - все, что можно сделать. Это, вероятно, достаточно хорошо с LHM, учитывая, что я только видел, что проблемы производительности в высоком потоке рассчитывают на серверную сторону. Так +1 к ответам выше.
Python 2 использует ascii
в качестве кодировка по умолчанию для исходных файлов, это означает, что вы должны указать другую кодировку в верхней части файла, чтобы использовать символы Unicode, отличные от ascii, в литералах. Python 3 использует utf-8
в качестве кодировки по умолчанию для исходных файлов, поэтому это не проблема.
См.: http://docs.python.org/tutorial/interpreter.html#source-code-encoding
Чтобы включить исходную кодировку utf-8, это должно быть в одной из двух верхних строк:
# -*- coding: utf-8 -*-
выше находится в документации, но это также работает:
# coding: utf-8
Дополнительные соображения:
Исходный файл также должен быть сохранен с использованием правильной кодировки в вашем текстовом редакторе.
В Python 2 литерал Unicode должен иметь u
перед ним, как в s.replace (u "Â", u "")
Но в Python 3 просто используйте кавычки. В Python 2 вы можете из __future__ import unicode_literals
для получения поведения Python 3, но имейте в виду, что это влияет на весь текущий модуль.
s.replace (u "Â", u "")
также завершится ошибкой, если s
не является строкой Unicode.
строка. replace
возвращает новую строку и не редактирует на месте, поэтому убедитесь, что вы также используете возвращаемое значение
def removeNonAscii(s): return "".join(filter(lambda x: ord(x)<128, s))
редактировать: мой первый импульс - всегда использовать фильтр, но выражение генератора более эффективно с точки зрения памяти (и короче) ...
def removeNonAscii(s): return "".join(i for i in s if ord(i)<128)
Имейте в виду, что это гарантированно работает с кодировкой UTF-8 (потому что все байты в многобайтовом формате у символов старший бит установлен в 1).
>>> unicode_string = u"hello aåbäcö"
>>> unicode_string.encode("ascii", "ignore")
'hello abc'
Использование Regex:
import re
strip_unicode = re.compile("([^-_a-zA-Z0-9!@#%&=,/'\";:~`\$\^\*\(\)\+\[\]\.\{\}\|\?\<\>\\]+|[^\s]+)")
print strip_unicode.sub('', u'6Â 918Â 417Â 712')
#!/usr/bin/env python
# -*- coding: utf-8 -*-
s = u"6Â 918Â 417Â 712"
s = s.replace(u"Â", "")
print s
Будет напечатан 6 918 417 712
s.replace(u'Â ', '') # u before string is important
и сделайте свой .py
файлом Unicode.
Это грязный прием, но он может работать.
s2 = ""
for i in s:
if ord(i) < 128:
s2 += i