В последующем ответе Вы спросили об относительной производительности этих двух альтернатив:
z1 = dict(x.items() + y.items())
z2 = dict(x, **y)
На моей машине, по крайней мере (довольно обычный x86_64 под управлением Python 2.5.2), альтернатива z2
не только короче и более проста, но также и значительно быстрее. Можно проверить это для себя с помощью timeit
модуль, который идет с Python.
Пример 1: идентичные словари, отображающие 20 последовательных целых чисел на себя:
% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z1=dict(x.items() + y.items())'
100000 loops, best of 3: 5.67 usec per loop
% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z2=dict(x, **y)'
100000 loops, best of 3: 1.53 usec per loop
z2
победы фактором 3,5 или около этого. Различные словари, кажется, приводят к очень отличающимся результатам, но z2
всегда, кажется, выходит вперед. (Если Вы получаете непоследовательные результаты для тот же тест, попытайтесь передать в [1 112] с числом, больше, чем значение по умолчанию 3.)
Пример 2: неперекрывающиеся словари, отображающие 252 коротких строки на целые числа и наоборот:
% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z1=dict(x.items() + y.items())'
1000 loops, best of 3: 260 usec per loop
% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z2=dict(x, **y)'
10000 loops, best of 3: 26.9 usec per loop
z2
победы приблизительно фактором 10. Это - довольно большая победа в моей книге!
После сравнения тех двух, я задался вопросом, могла ли z1
низкая производительность быть приписана издержкам построения двух списков объекта, которые в свою очередь привели меня задаваться вопросом, могло ли это изменение работать лучше:
from itertools import chain
z3 = dict(chain(x.iteritems(), y.iteritems()))
Несколько быстрых тестов, например,
% python -m timeit -s 'from itertools import chain; from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z3=dict(chain(x.iteritems(), y.iteritems()))'
10000 loops, best of 3: 66 usec per loop
приводят меня приходить к заключению, что z3
несколько быстрее, чем [1 116], но совсем не с такой скоростью, как [1 117]. Определенно не стоящий всего дополнительного ввода.
Это обсуждение все еще пропускает что-то важное, которое является сравнением производительности этих альтернатив с "очевидным" способом объединить два списка: использование update
метод. Чтобы попытаться сохранить вещи в равных условиях с выражениями, ни одно из которых не изменяет x или y, я собираюсь сделать копию x вместо того, чтобы изменить его оперативный, следующим образом:
z0 = dict(x)
z0.update(y)
А типичный результат:
% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z0=dict(x); z0.update(y)'
10000 loops, best of 3: 26.9 usec per loop
, Другими словами, z0
и z2
, кажется, имею чрезвычайно идентичную производительность. Вы думаете, что это могло бы быть совпадением? Я не делаю....
На самом деле, я пошел бы, насколько утверждать, что для чистого кода Python невозможно сделать немного лучше, чем это. И если можно сделать значительно лучше в дополнительном модуле C, я предполагаю, что люди Python могли бы хорошо интересоваться слиянием кода (или изменение на подходе) в ядро Python. Использование Python dict
в большом количестве мест; оптимизация его операций является грандиозным предприятием.
Вы могли также записать это как [1 136]
z0 = x.copy()
z0.update(y)
, как Tony делает, но (не удивительно) различие в нотации, оказывается, не имеет любой измеримый эффект на производительность. Используйте, какой бы ни выглядит правильным Вам. Конечно, он абсолютно корректен, чтобы указать, что версию с двумя операторами намного легче понять.
Предполагая, что вы не рассматриваете это как обучающий опыт, я бы предложил взять реализацию C ++ / C и обернуть ее через C ++ / CLI.
Однако единственное упоминание о клиенте Windows с открытым исходным кодом для NFS 4 - это этот проект при финансовой поддержке MS и университета, который написал эталонную реализацию для многих других ОС
. их заявление о намерениях и предлагает двухлетний проект, извините.
Вы можете попробовать перенести сервер Alfresco JLAN на C #. Он написан на Java, но эти два языка очень похожи.
Alfresco JLAN использует виртуальный файл. системный интерфейс, позволяющий подключите свою собственную файловую систему реализация с главным сервером обработка всего сетевого протокола обмен между клиентом и сервер. JLAN также единственный Java реализация Windows CIFS (Общая файловая система Интернета), в в дополнение к поддержке NFS и FTP.
Учитывая, что NFS основан на ONC RPC и XDR , я рекомендую использовать реализацию XDR для C #, например RPC.NET .
Я рекомендую начать с последней версии стабильный исходный код NFS, а затем запустите его из Cygwin (см. ниже). Затем вы начнете с полнофункционального, хорошо протестированного клиента и сервера NFS, который затем можно настроить по своему усмотрению.
Попробуйте этот сайт: Cygwin NFS Server HOWTO
Здравствуйте, вы можете посмотреть на мой проект с открытым исходным кодом http://code.google.com/p/nekodrive. Вы можете использовать непосредственно библиотеку NekoDrive.NFS c#, которая обертывает мою реализацию протокола NFS V2 и V3 (скоро будет V4.1)... Она пока не поддерживает полный протокол, но работает для основных функций просмотра/загрузки/выгрузки...
надеюсь это поможет
Вот порт remotetea, который, кажется, работает http://sourceforge.net/projects/remoteanet/