Как работать, ОС окружают команды в IronPython/Mono?

Вы пояснили, что массивы всегда будут одинакового размера. Это обязательное условие.

1119 Итак, ваша ситуация следующая. У вас есть вектор A здесь, и вектор B там. У вас нет никаких гарантий, находятся ли фактическая память, которую использует вектор A, и фактическая память, которую использует вектор B, рядом друг с другом. Они могут быть где угодно.

Теперь вы объединяете два вектора в третий вектор C. Опять же, нет никаких гарантий, где находится память вектора С.

Итак, у вас действительно очень мало работы с точки зрения оптимизации. У вас нет никаких дополнительных гарантий вообще. Это очень важно: у вас есть два фрагмента байтов, и эти два фрагмента нужно скопировать в другое место. Вот и все. Это то, что должно быть сделано, это то, к чему все сводится, и нет другого способа сделать это, кроме как сделать именно это.

1122 Но есть одна вещь, которую можно сделать, чтобы сделать вещи немного быстрее. Вектор обычно выделяет память для своих значений в пошаговых шагах, первоначально резервируя некоторое дополнительное пространство, и по мере того, как значения добавляются к вектору, один за другим, и в конечном итоге достигают зарезервированного размера вектора, вектор должен теперь получить новый больший блок памяти, скопируйте все в векторе в больший блок памяти, затем удалите старый блок и только затем добавьте следующее значение в вектор. Затем цикл начинается снова.

Но вы заранее знаете, сколько значений вы собираетесь добавить к вектору, поэтому вы просто указываете вектору reserve () достаточный размер заранее, чтобы ему не приходилось многократно увеличиваться, как вы добавляете значения к нему. Перед вашим существующим циклом for просто:

pairVector.reserve(pairVector.size()+strVector.size());

Теперь цикл for продолжится и вставит новые значения в pairVector, который гарантированно будет иметь достаточно места.

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

for (int i = 0; i < strVector.size(); ++i )

Следующий шаг: at() выполняет проверку границ. Этот цикл гарантирует, что i никогда не выйдет за пределы, поэтому проверка границ at() - это также некоторые накладные расходы, от которых можно безопасно избавиться:

    pairVector.push_back(pair<string, int> (strVector[i], intVector[i]));

Далее: с помощью современного компилятора C ++, компилятор должен иметь возможность автоматически оптимизировать удаление нескольких избыточных временных и временных копий. Возможно, вам может понадобиться немного помочь компилятору и использовать emplace_back () вместо push_back () (при условии, что C ++ 11 или более поздняя версия):

    pairVector.emplace_back(strVector[i], intVector[i]);

Возвращение к условию цикла, strVector.size() вычисляется на каждой итерации цикла. Весьма вероятно, что современный компилятор C ++ его оптимизирует, но на всякий случай вы также можете помочь своему компилятору проверить вектор size() только один раз:

int i=strVector.size();
for (int i = 0; i < n; ++i )

Это действительно растянуто, но это может извлеките несколько дополнительных квантов времени выполнения. И это в значительной степени все очевидные оптимизации здесь. Реально, самое большее, что можно получить здесь, это использовать reserve(). Другие оптимизации могут помочь немного больше, но все сводится к перемещению определенного количества байтов из одной области памяти в другую. Нет действительно особых способов сделать это, это быстрее, чем другие способы.

5
задан Cyberdrow 1 May 2009 в 07:34
поделиться

4 ответа

Я нашел Ответ. Благодаря "Поваренной книге IronPython". Больше информации на эту тему можно найти там: http://www.ironpython.info/index.php/Launching_Sub-Processes

>>> from System.Diagnostics import Process
>>> p = Process()
>>> p.StartInfo.UseShellExecute = False
>>> p.StartInfo.RedirectStandardOutput = True
>>> p.StartInfo.FileName = 'uname'
>>> p.StartInfo.Arguments = '-m -r'
>>> p.Start()
True
>>> p.WaitForExit()
>>> p.StandardOutput.ReadToEnd()
'9.6.0 i386\n'
>>> p.ExitCode
0
>>> 
11
ответ дан 13 December 2019 в 05:42
поделиться

Вы можете использовать большинство стандартных модулей os из Ironpython.

import sys
sys.path.append path('...pathtocpythonlib......')
import os
1
ответ дан 13 December 2019 в 05:42
поделиться

Consider this C# Interactive Shell too....not sure if it supports IronPhython in the shell, but Mono does as you know.

0
ответ дан 13 December 2019 в 05:42
поделиться

Здесь есть частичная реализация модуля подпроцесса:

http://www.bitbucket.org/jdhardy/code/src/tip/subprocess.py

Модуль (на данный момент, июнь 2010 г.) поддерживает только перенаправление каналов STDIO (например, вы не можете предоставить свои собственные файловые объекты для заполнения выводом или для потоковой передачи intput), но основ достаточно, чтобы обойтись.

0
ответ дан 13 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

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