If you want to drive the object directly instead of using forces then try the setLinearVelocity() method on game objects.
import GameLogic as G
cont = G.getCurrentController()
obj = cont.owner
linV = [0,1,0]
obj.setLinearVelocity(linV,0)
To use this with the script above, substitute “act.force = (force)” for “cube.setLinearVelocity(force,0)”. Then you could change “multiplier” to whatever seems good.
You could then delete the lines that set up the motion actuator and get rid of the motion actuator from the logic blocks.
Alternatively, you could research servo motion and use a servo motion actuator then tune it to behave how you want.
Edit: Not had much experience with servos myself so had a bit of a mess about. Here’s a .blend:
http://www.pasteall.org/blend/228
Change the Max and Min values on the servo actuator to change the maximum and minimum forces applied. Higher values will change velocity faster. The linV values are the target speeds as set in the script. The P,I,D values also change how the servo acts.
In the .blend, I set the Q and E keys to increment/decrement the multiplier so the direction and magnitude of the target velocity can be altered. You should see that the cube returns to rest/goes the opposite way pretty quickly with the current settings.
I find experiments are the best way to learn, but it’s good to have a starting point to work from. 
Just noticed… In the script, I use the original variable name “force”. In this implementation this is confusing. A better name would be “targetVelocity”.
Edit 2: Shrunk down the script a bit to see how small I could get it. 
import GameLogic as G, Mathutils as M
scene = G.getCurrentScene()
cont = G.getCurrentController()
act = cont.actuators['act']
for obj in scene.objects:
if obj.name == "OBCube": cube = obj
if obj.name == "OBCamera": camera = obj
vec = M.Vector(camera.getVectTo(cube)[1])
vec *= cube['multiplier']
act.linV = [vec[0],vec[1],vec[2]]
act.useLocalLinV = False
cont.activate(act)
12 lines isn’t bad, I don’t think. 