Выбор встроенного языка

Я подаю заявку, которая анализирует одну или несколько серий данных с помощью нескольких различных алгоритмов (агенты). Я пришел к идее, что каждый из этих агентов мог быть реализован как отдельные скрипты Python, которые я запускаю использование или API Python C или Повышение. Python в моем приложении.

Я немного волнуюсь по поводу служебного TBH во время выполнения, поскольку я делаю некоторую довольно усиленную обработку данных, и я не хочу должным быть ожидать несколько минут каждого моделирования. Я буду обычно делать сотни тысяч, если не миллионы, повторений, в которых я вызываю внешние "агенты"; я имею лучше просто жесткое кодирование все в приложении, или производительность отбросит быть терпимой?

Кроме того, есть ли какие-либо другие интерпретируемые языки, которые я могу использовать кроме Python?

7
задан Rune Aamodt 9 February 2011 в 20:23
поделиться

6 ответов

Да, тонн. Lua и Python кажется самым популярным:

встраивает Lua

Встраивание Python

Встраивание Tcl

Встраивание Ruby

встроить Perl

встроить JavaScript

Есть десятки двигателей JavaScript, это просто пример. Некоторые из них также пугают быстро.

10
ответ дан 6 December 2019 в 06:03
поделиться

TCL был разработан с земли до встроенного языка.

5
ответ дан 6 December 2019 в 06:03
поделиться

Можно ли переопределить COM-интерфейс с 3-ьей вечеринки и использовать его с moq.

Кажется, что вы намереваетесь удалить внешнюю зависимость, и moq не играет хорошо с COMInterop сборкой, вы должны иметь возможность открыть рефлектор и вытащить любые определения интерфейсов, которые вы хотите из interop сборки, определить макет и запустить ваши модульные тесты

-121--3909843-

Можно рассмотреть возможность установки подключаемого модуля LargeFile . Он отключает несколько функций, влияющих на производительность.

-121--2938676-

Я полагаю, что tcl и Rexx были предназначены для этой цели.

2
ответ дан 6 December 2019 в 06:03
поделиться

Для миллионов звонков (от я предполагаю C ++, потому что вы упомянули Boost) в Python, да: вы заметите попадание производительности. Это может или не может быть значительным - возможно, усиление скорости опробования новых «агентов» будет больше, чем удар. У Python есть быстрые численные библиотеки (такие как Numpy), которые могут помочь, но вы все равно понесли накладные расходы на маршаллинг данных, призывая к Python, Gil и т. Д.

Да, вы можете встроить много других языков: проверить LUA Отказ Также проверьте SWIG.ORG, который может подключиться к многим другим языкам, кроме Python.

1
ответ дан 6 December 2019 в 06:03
поделиться

Очень хороший раствор Bradhouse. Есть ли способ применить аннотацию @matches до более чем одного поля?

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

@Matches(fields={"password", "email"}, verifyFields={"confirmPassword", "confirmEmail"})
public class UserRegistrationForm  {

    @NotNull
    @Size(min=8, max=25)
    private String password;

    @NotNull
    @Size(min=8, max=25)
    private String confirmPassword;


    @NotNull
    @Email
    private String email;

    @NotNull
    @Email
    private String confirmEmail;
}

код для аннотации:

package springapp.util.constraints;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = MatchesValidator.class)
@Documented
public @interface Matches {

  String message() default "{springapp.util.constraints.matches}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  String[] fields();

  String[] verifyFields();
}

и реализация:

package springapp.util.constraints;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.apache.commons.beanutils.BeanUtils;

public class MatchesValidator implements ConstraintValidator<Matches, Object> {

    private String[] fields;
    private String[] verifyFields;

    public void initialize(Matches constraintAnnotation) {
        fields = constraintAnnotation.fields();
        verifyFields = constraintAnnotation.verifyFields();
    }

    public boolean isValid(Object value, ConstraintValidatorContext context) {

        boolean matches = true;

        for (int i=0; i<fields.length; i++) {
            Object fieldObj, verifyFieldObj;
            try {
                fieldObj = BeanUtils.getProperty(value, fields[i]);
                verifyFieldObj = BeanUtils.getProperty(value, verifyFields[i]);
            } catch (Exception e) {
                //ignore
                continue;
            }
            boolean neitherSet = (fieldObj == null) && (verifyFieldObj == null);
            if (neitherSet) {
                continue;
            }

            boolean tempMatches = (fieldObj != null) && fieldObj.equals(verifyFieldObj);

            if (!tempMatches) {
                addConstraintViolation(context, fields[i]+ " fields do not match", verifyFields[i]);
            }

            matches = matches?tempMatches:matches;
        }
        return matches;
    }

    private void addConstraintViolation(ConstraintValidatorContext context, String message, String field) {
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(message).addNode(field).addConstraintViolation();
    }
}
-121--589526-

Вы, вероятно, можете создать встроенный язык с использованием шаблонов C ++ и перегрузка оператора, см. Например, например, языки Matrix UBLAS или FTENSOR. Я не думаю, что Python или другие интерпретированные языки подходят для отмены обработки / обработки данных.

0
ответ дан 6 December 2019 в 06:03
поделиться

Ваш первый подход Чтобы удалить SDTRUN и добавление нового, очевидно, удалит форматирование, поскольку вы добавляете только бега, но не RunStyle. Чтобы сохранить форматирование, вы должны создавать элементы запуска, такие как

new Run( new RunProperties(new RunStyle(){ Val = "MyStyle" }),
                            new Text("Replacement Text"));

Ваш второй подход к замене всех , заменители будут работать на элемент управления контентом простого текста, только потому, что богатый контроль контента текста не имеет элемента SDTRUN. Богатый контроль контента текста - SDTBLOCK с элементами SDTContent. Богатый контроль контента текста может иметь несколько абзацев, несколько прогонов и несколько текстов. Таким образом, ваш код sdtrun.descendants (). First (). Текст = заменатекст , будет поврежден для богатого элемента управления контентом текста. Нет ни одного строкового кода для замены всего текста богатого контроля контента и еще сохраняет все форматирование.

Я не понял, что вы подразумеваете под «его не избавляются от контроля контента в окончательном документе»? Я думал, что ваше требование здесь состоит в том, чтобы изменить текст (контент) только путем сохранения контроля контента и форматирования.

-121--3879846-

Я обычно буду принимать сотни тысяч, если не миллионы, итерации, в которых я вызываю внешние «агенты»

, капля производительности будет заметным, возможно, болезненным. Если вы можете поместить данные в массивы и обработать его в партиях, используя Numpy , он должен быть намного быстрее.

Numpy делает его супер легко сделать какой-либо арифметик в миллион раз подряд. Например, в квадрате каждого элемента массива это похоже на следующее:

>>> x = numpy.array([1, 2, 3, 4, 5, 6, 7])
>>> x**2
array([1, 4, 9, 16, 25, 36, 49])

Super Easy, а узкая внутренняя петля здесь фактически реализована в C.

, конечно, Numpy может также сделать более продвинутый номер.

3
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

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