Здравствуйте, FR, Вы писали:
FR>когда демка загрузится она обычно работает немного медленее чем аналогичная плюсовая, но вот грузится намного дольше.
Значит надо смотреть что они там делают.
FR>так ты сам должен лучше меня знать
А я вот не знаю просвети не разумного.
FR>Насчет скоростных скриптов да это плюс. Но я не вижу удешевления например по сравнению со связкой C++ — Python, не забывая учитывать что на питоне все таки проще писать чем на C#.
Это в каком это месте на питоне писать проще чем на C#? Просвети пожалуйста. И еще не забывай что для C# есть такие мегарулезы как ReSharper у меня по началу создавалось впечатление что эта штука мои мысли читает.
А если Влад доведет до рабочего состояния R# то это вобще будет супер.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, FR, Вы писали:
FR>>когда демка загрузится она обычно работает немного медленее чем аналогичная плюсовая, но вот грузится намного дольше. WH>Значит надо смотреть что они там делают.
FR>>так ты сам должен лучше меня знать WH>А я вот не знаю просвети не разумного.
знаешь
FR>>Насчет скоростных скриптов да это плюс. Но я не вижу удешевления например по сравнению со связкой C++ — Python, не забывая учитывать что на питоне все таки проще писать чем на C#. WH>Это в каком это месте на питоне писать проще чем на C#? Просвети пожалуйста. И еще не забывай что для C# есть такие мегарулезы как ReSharper у меня по началу создавалось впечатление что эта штука мои мысли читает.
Питон как язык выше уровнем и шарпа и плюсов, объем кода сильно уменьшается, кроме того питон сам подталкивает к обобщенному программированию поэтому очень легко писать повторно используемый код.
WH>А если Влад доведет до рабочего состояния R# то это вобще будет супер.
Здравствуйте, FR, Вы писали:
WH>>А я вот не знаю просвети не разумного. FR>знаешь
Нет. Не знаю.
FR>Питон как язык выше уровнем и шарпа и плюсов, объем кода сильно уменьшается, кроме того питон сам подталкивает к обобщенному программированию поэтому очень легко писать повторно используемый код.
Примеры в студию. Только мериться будем с C#2
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, FR, Вы писали:
WH>>>А я вот не знаю просвети не разумного. FR>>знаешь WH>Нет. Не знаю.
FR>>Питон как язык выше уровнем и шарпа и плюсов, объем кода сильно уменьшается, кроме того питон сам подталкивает к обобщенному программированию поэтому очень легко писать повторно используемый код. WH>Примеры в студию. Только мериться будем с C#2
По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам:
arr = open("test.txt").readlines()
arr.sort()
out = open("out.txt", "w")
for line in arr:
print >> out, line,
Суммирование чисел из файла(в каждой строке файла одно число):
Другой пример я уже приводил Владу, простейший калькулятор(он из темы где вы с Владом спорили и ты делал этот же калькулятор на плюсах ссылки к сожалению не помню)
# -*- coding: cp1251 -*-
import psyco, time
from math import sin
from math import cos
formula =r"-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234\
-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234\
-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234\
-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234\
-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234-(asd-qwe)*3*3*asd/(asd-sin(qwe)+5/asd)-123.234"
ParseCount = 1
CalcCount = 10000
#компилируем
t1 = time.clock()
for i in xrange(ParseCount):
f = eval(compile("lambda asd, qwe : " + formula, "<string>", "eval"))
psyco.bind(f)
t2 = time.clock()
print "Парсинг %d проходов. Выполнено за %f сек." % (ParseCount, t2 - t1)
#используем
def run():
t1 = time.clock()
for i in xrange(1, CalcCount + 1):
f(i, i)
t2 = time.clock()
print "Подсчет %d проходов. Выполнено за %f сек." % (CalcCount, t2 - t1)
psyco.bind(run)
run()
run()
print "f(1, 1,) =", f(1, 1)
print "f(-1, 333) =", f(-1, 333)
Здравствуйте, FR, Вы писали:
FR>По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам: FR>
FR>arr = open("test.txt").readlines()
FR>arr.sort()
FR>out = open("out.txt", "w")
FR>for line in arr:
FR> print >> out, line,
FR>
Здравствуйте, FR, Вы писали:
FR>По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам:
Функции readlines в библиотеке .НЕТ нет по этому мы ее напишем.
static IEnumerable<string> Lines(Stream stream)
{
using (StreamReader reader = new StreamReader(stream))
for (string line; (line = reader.ReadLine()) != null; )
yield return line;
}
List<string> lines;
using (Stream file = File.OpenRead("text.txt"))
lines = new List<string>(Lines(file));
lines.Sort();
FR>out = open("out.txt", "w")
FR>for line in arr:
FR> print >> out, line,
using (TextWriter file = File.CreateText("out.txt"))
foreach (string line in lines)
file.WriteLine(file);
Отсутствие типизации и необходимости объявлять переменные в питоне я считаю большим недостатком.
FR>Суммирование чисел из файла(в каждой строке файла одно число):
Опять библиотека...
Да будут операторы
delegate T Operator<T>(T l, T r);
interface IMathOperators<T>
{
Operator<T> Add { get; }
Operator<T> Sub { get; }
Operator<T> Mul { get; }
Operator<T> Div { get; }
}
class MathOperatorsInt : IMathOperators<int>
{
public Operator<int> Add { get { return delegate(int l, int r) { return l + r; }; } }
public Operator<int> Sub { get { return delegate(int l, int r) { return l - r; }; } }
public Operator<int> Mul { get { return delegate(int l, int r) { return l * r; }; } }
public Operator<int> Div { get { return delegate(int l, int r) { return l / r; }; } }
}
static Dictionary<Type, object> MathOperatorsMap = new Dictionary<Type, object>();
static IMathOperators<T> MathOperators<T>()
{
return (IMathOperators<T>)MathOperatorsMap[typeof(T)];
}
static Program()
{
MathOperatorsMap.Add(typeof(int), new MathOperatorsInt());
}
Теперь сделаем недостающие функции
delegate T Parse<T>(string s);
static IEnumerable<T> Map<T>(Stream stream)
{
Parse<T> parse = (Parse<T>)Delegate.CreateDelegate(typeof(Parse<T>),
typeof(T), "Parse");
foreach (string line in Lines(stream))
yield return parse(line);
}
static T Sum<T>(IEnumerable<T> numbers)
{
Operator<T> add = MathOperators<T>().Add;
T val = default(T);
foreach (T number in numbers)
val = add(val, number);
return val;
}
using (Stream file = File.OpenRead("text.txt"))
Console.WriteLine(Sum(Map<int>(file)));
FR>Другой пример я уже приводил Владу, простейший калькулятор(он из темы где вы с Владом спорили и ты делал этот же калькулятор на плюсах ссылки к сожалению не помню)
Это тоже решается библиотекой.
А самое главное что все что ты привел очень синтетические задачи не имеющие с реальностью ничего общего.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, FR, Вы писали:
FR>>По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам: FR>>
FR>>arr = open("test.txt").readlines()
FR>>arr.sort()
FR>>out = open("out.txt", "w")
FR>>for line in arr:
FR>> print >> out, line,
FR>>
AVK>А закрывать файлы кто будет?
GC
Вообще на питоне если на файл ссылок нет он сразу после использования закрывается.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, FR, Вы писали:
FR>>По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам: WH>Функции readlines в библиотеке .НЕТ нет по этому мы ее напишем. WH>
WH> List<string> lines;
WH> using (Stream file = File.OpenRead("text.txt"))
WH> lines = new List<string>(Lines(file));
WH> lines.Sort();
WH>
WH>
FR>>out = open("out.txt", "w")
FR>>for line in arr:
FR>> print >> out, line,
WH>
WH> using (TextWriter file = File.CreateText("out.txt"))
WH> foreach (string line in lines)
WH> file.WriteLine(file);
WH>
WH>Отсутствие типизации и необходимости объявлять переменные в питоне я считаю большим недостатком.
Код все равно больше по объему.
А отсутствие типизпции может быть и преимуществом.
FR>>Суммирование чисел из файла(в каждой строке файла одно число): WH>Опять библиотека...
В первом примере никаких библиотек не использовалось только встроенные возможности языка.
В этом же примере показана возможность программировать в функциональном стиле и шарпу тоже не мешало бы такое ввести в стандартные библиотеки
WH>Да будут операторы WH>
WH> delegate T Operator<T>(T l, T r);
WH> interface IMathOperators<T>
WH> {
WH> Operator<T> Add { get; }
WH> Operator<T> Sub { get; }
WH> Operator<T> Mul { get; }
WH> Operator<T> Div { get; }
WH> }
WH> class MathOperatorsInt : IMathOperators<int>
WH> {
WH> public Operator<int> Add { get { return delegate(int l, int r) { return l + r; }; } }
WH> public Operator<int> Sub { get { return delegate(int l, int r) { return l - r; }; } }
WH> public Operator<int> Mul { get { return delegate(int l, int r) { return l * r; }; } }
WH> public Operator<int> Div { get { return delegate(int l, int r) { return l / r; }; } }
WH> }
WH> static Dictionary<Type, object> MathOperatorsMap = new Dictionary<Type, object>();
WH> static IMathOperators<T> MathOperators<T>()
WH> {
WH> return (IMathOperators<T>)MathOperatorsMap[typeof(T)];
WH> }
WH> static Program()
WH> {
WH> MathOperatorsMap.Add(typeof(int), new MathOperatorsInt());
WH> }
WH>
WH>Теперь сделаем недостающие функции WH>
WH> delegate T Parse<T>(string s);
WH> static IEnumerable<T> Map<T>(Stream stream)
WH> {
WH> Parse<T> parse = (Parse<T>)Delegate.CreateDelegate(typeof(Parse<T>),
WH> typeof(T), "Parse");
WH> foreach (string line in Lines(stream))
WH> yield return parse(line);
WH> }
WH> static T Sum<T>(IEnumerable<T> numbers)
WH> {
WH> Operator<T> add = MathOperators<T>().Add;
WH> T val = default(T);
WH> foreach (T number in numbers)
WH> val = add(val, number);
WH> return val;
WH> }
WH>
WH> using (Stream file = File.OpenRead("text.txt"))
WH> Console.WriteLine(Sum(Map<int>(file)));
WH>
FR>>Другой пример я уже приводил Владу, простейший калькулятор(он из темы где вы с Владом спорили и ты делал этот же калькулятор на плюсах ссылки к сожалению не помню) WH>Это тоже решается библиотекой.
В примере на питоне все решается без библиотек.
WH>А самое главное что все что ты привел очень синтетические задачи не имеющие с реальностью ничего общего.
Так давай реальные примеры, лучше в виде постоновки небольших задач.
Здравствуйте, FR, Вы писали:
FR>По объему кода, вот простейшая программка считывает файл построчно и выводит его в другой файл отсортированным по строкам: FR>
FR>arr = open("test.txt").readlines()
FR>arr.sort()
FR>out = open("out.txt", "w")
FR>for line in arr:
FR> print >> out, line,
FR>
А теперь то же самое с использованием возможностей питона 2.4:
Здравствуйте, FR, Вы писали:
FR>В этом же примере показана возможность программировать в функциональном стиле и шарпу тоже не мешало бы такое ввести в стандартные библиотеки
Здравствуйте, FR, Вы писали:
FR>Код все равно больше по объему.
И что с того если все это за меня автокомплит набил? FR>А отсутствие типизпции может быть и преимуществом.
Да правда чтоли? Интересно почему тогда весь мейнстрем типизированый по самое нехочу?
FR>В первом примере никаких библиотек не использовалось только встроенные возможности языка.
Те в язык встроели работу с файлами? FR>В этом же примере показана возможность программировать в функциональном стиле и шарпу тоже не мешало бы такое ввести в стандартные библиотеки
Зачем?
Елси мне очень сильно приспичет пописать на функциональном языке то я возьму функциональный язык. Благо их на .НЕТ портировано до чертиков.
FR>В примере на питоне все решается без библиотек.
Ну не встроели в C# вызов соответствующих функций фреймворка... беда то какая.
FR>Так давай реальные примеры, лучше в виде постоновки небольших задач.
Тема была про скрипты в играх. А для чего в играх используются скрипты? Правильно чтобы объекты в игре что-то делали.
class World
{
public IEnumerable<GameObject> GetObjects(Position pos, float range)
{
foreach (GameObject obj in objects)
if (obj.Pos.DistanceTo(pos) < range)
yield return obj;
}
}
class Bomb : GameObject
{
public void Detonation()
{
foreach (GameObject obj in world.GetObjects(Pos, detonationRange))
obj.Damage(detonationDamage);
}
}
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, FR, Вы писали:
FR>>Вообще на питоне если на файл ссылок нет он сразу после использования закрывается.
AVK>Т.е. GC запускается на каждую строчку кода?
такого GC как в CLR — нет.
Банальный счетчик ссылок. Как только ob_refcnt становится равным нулю — объект дестроится.
Правда слегка оптимизирован: если у объекта нет деструктора, то он не free-ится а помещается в специальный список, который чистится пакетно — при переполнении.
... << RSDN@Home 1.1.4 beta 5 rev. 395>> {WinAmp: Whitney Houston — I Wanna Dance With Somebody (Who Loves Me)}
Здравствуйте, eugals, Вы писали:
E>Здравствуйте, AndrewVK, Вы писали:
AVK>>Здравствуйте, FR, Вы писали:
FR>>>Вообще на питоне если на файл ссылок нет он сразу после использования закрывается.
AVK>>Т.е. GC запускается на каждую строчку кода?
E>такого GC как в CLR — нет. E>Банальный счетчик ссылок. Как только ob_refcnt становится равным нулю — объект дестроится. E>Правда слегка оптимизирован: если у объекта нет деструктора, то он не free-ится а помещается в специальный список, который чистится пакетно — при переполнении.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, eugals, Вы писали:
AVK>>>Т.е. GC запускается на каждую строчку кода?
E>>такого GC как в CLR — нет. E>>Банальный счетчик ссылок.
AVK>Как в VB6?
Похоже, но не совсем. Отличия:
1. В VB6 есть разделение на value-типы и на объектные, а в питоне всё есть объект, соответственно и счетчик тоже висит на всём подряд.
2. Есть детектор циклов (запускается время от времени и убивает зависшие объекты).
Правда, этот детектор хорош только если вся программа написана на чистом питоне — безо всяких сиплюсплюсных библиотек
... << RSDN@Home 1.1.4 beta 5 rev. 395>> {WinAmp: Faith No More — We Care a Lot [Original Version]}