Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако если производительность имеет значение, то стоит взять Си
язык, позволяющий эффективнее заниматься оптимизацией
имя, сестра, имя!
а арифметика указателей — это как раз применение знания особенностей архитектуры машины для написания более эффективного кода.
Я не вижу особой разницы между решением задачи в терминах языка А и решением ее же в терминах языка Б
И да, я считаю, что задача, адаптированная к машине, будет в итоге скомпилирована в более эффективный код
До сих пор мне не встречалось ни одной задачи, не решаемой на чистом C.
А интерпретируемые языки, безусловно, медленнее, поэтому мне было немного непонятно, почему вы привели в пример питон.
def func1(a1, a2):
... some calculations
return something1
def func2(b1, b2, b3, b4, b5, b6=v1, b7=v2):
... some calculations
return something2
@memoize
def func1(a1, a2):
... some calculations
return something1
@memoize
def func2(b1, b2, b3, b4, b5, b6=v1, b7=v2):
... some calculations
return something2
Безусловно, сам мемоизатор получится достаточно сложным, но я думаю, что реализация этого атрибута @memoize в питоне ничуть не проще :)
from decorator import decorator
def getattr_(obj, name, default_thunk):
"Similar to .setdefault in dictionaries."
try:
return getattr(obj, name)
except AttributeError:
default = default_thunk()
setattr(obj, name, default)
return default
@decorator
def memoize(func, *args):
dic = getattr_(func, "memoize_dic", dict)
if args in dic:
return dic[args]
else:
result = func(*args)
dic[args] = result
return result
и кастинги != баги.
(=) ≠ (⇒) ☺
template<typename R, typename ... Args>
std::function<R(Args ...)> memoize(R f(Args ...))
{
auto l_f = [=](Args ... args) -> R
{
typedef std::tuple<Args ...> args_pack_t;
typedef std::tuple<args_pack_t, R> memoize_val_t;
static std::vector<memoize_val_t> values;
args_pack_t args_pack(args ...);
for (auto p = values.begin(); p != values.end(); ++ p)
{
if (std::get<0>(*p) == args_pack)
return std::get<1>(*p);
}
R ret_val = f(args ...);
values.push_back(memoize_val_t(args_pack, ret_val));
return ret_val;
};
return l_f;
}
int f(int a, double b)
{
return (a + 10) * b;
}
int main()
{
auto f_ = memoize(f);
std::cout << f_(10, 20) << std::endl;
std::cout << f_(10, 20) << std::endl;
std::cout << f_(10, 40) << std::endl;
return 0;
}
Если задача действительно сложна, и производительность реально имеет значение, то стоит выкинуть C/C++. И взять язык, позволяющий эффективнее заниматься оптимизацией. А не слежением за памятью или арифметикой указателей.
Любой ЯВУ.
Где занимаешься задачей в терминах задачи, а не «байтов»/«указателей»/«шаблонов».
Математики, Маткады, Матлабы
Однако если производительность имеет значение, то стоит взять Си, и иметь ввиду архитектуру машины «много лишнего», как вы выразились.
Мне совсем непонятно, почему «производительность» и «безопасность» для языка — взаимоисключающие понятия.
О неявных объявлениях, обратной совместимости и ABI